thảo luận Leetcode mỗi ngày

Java:
class Solution {
    public int firstMissingPositive(int[] nums) {
        int len = nums.length;
        for(int i=0; i<len; i++){
            nums[i] = nums[i] <= 0 ? Integer.MAX_VALUE : nums[i];
        }
        for(int i=0; i<len; i++){
            int idx = Math.abs(nums[i]) - 1;
            if(idx < len && nums[idx] > 0)
                nums[idx] *= -1;
        }
        for(int i=0; i<len; i++){
            if(nums[i] > 0)
                return i + 1;
        }
        return len + 1;
    }
}
 
Cố đặt tụi số dương n ngay tại vị trị n-1, khi đó, thằng đầu tiên không đúng vị trí của nó sẽ là thằng dương nhỏ nhất cần tìm.

Python:
class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        n = len(nums)
        for i in range(n):
            while 1 <= nums[i] <= n and nums[nums[i] - 1] != nums[i]:
                nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]

        for i in range(n):
            if nums[i] != i + 1:
                return i + 1
        return n + 1
 
Python:
class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        mp = {}
        for num in nums:
            if num > 0 :
                mp[num] = True

        minPos = 1
        while mp.get(minPos , False):
            minPos += 1
        
        return minPos
ko bt lm thế nào để space O(1) :angry:
 
Bài hôm nay cho thay đổi danh sách đầu vào nên vẫn là trick cũ,
Python:
class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        size = len(nums)
        for i in range(size):
            while nums[i] != i + 1 and nums[i] > 0 and nums[i] <= size:
                temp = nums[nums[i] - 1]
                if nums[i] == temp:
                    break
                nums[nums[i] - 1] = nums[i]
                nums[i] = temp
        for i in range(len(nums)):
            if nums[i] != i + 1:
                return i + 1
        return len(nums) + 1
 
Code:
class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        n = len(nums)
        for i in range(n):
            if nums[i] < 0 or nums[i] > n:
                nums[i] = n+1
        for i in range(n):
            while nums[i] <= n and nums[nums[i] - 1] != nums[i]:
                nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]

        for i in range(n):
            if nums[i] != i+1:
                return i + 1
        return n+1
 
Mấy bài daily đợt này hay nhờ, bài sau xài bài trước. Cơ mà cũng bí, đọc discussion có thanh niên giải thích mới biết đường làm. :)
C#:
public class Solution
{
    public int FirstMissingPositive(int[] nums)
    {
        int n = nums.Length;

        for (int i = 0; i < n; i++)
        {
            if (nums[i] <= 0)
            {
                nums[i] = n + 1;
            }
        }

        for (int i = 0; i < n; i++)
        {
            int num = Math.Abs(nums[i]);
            if (n < num)
            {
                continue;
            }

            int index = num - 1;
            nums[index] = -Math.Abs(nums[index]);
        }

        for (int i = 0; i < n; i++)
        {
            if (0 < nums[i])
            {
                return i + 1;
            }
        }

        return n + 1;
    }
}
 
Để ý thì thấy là first missing positive nó sẽ nằm trong range 0 -> n - 1
Nên tận dụng được cái index để mark nó thôi.
Python:
class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        for i in range(len(nums)):
            current = nums[i]
            while current - 1 < len(nums) and current - 1 >= 0:
                next = nums[current - 1]
                nums[current - 1] = float('-inf')
                current = next

        for i in range(len(nums)):
            if nums[i] != float('-inf'):
                return i + 1

        return len(nums) + 1
 
C#:
public class Solution {
    public int FirstMissingPositive(int[] nums) {
        int[] ints = new int[nums.Length+1];
        int result = 1;
        for(int i =0; i < nums.Length;i++)
        {
            if (nums[i] > nums.Length || nums[i] < 1)
                continue;
            else
                ints[nums[i]] = 1;
        }
        for(int i =1;i < ints.Length;i++)
        {
            if (ints[i] ==0)
            {
                result = i;
                break;
            }
            else
                result++;
        }
        return result;
    }
}
nhờ các thím check hộ code công nhân, requirement space = O(1) mà code tnay vẫn oke, ảo thật :D :D
 
JavaScript:
var firstMissingPositive = function(nums) {
    for (let i = 0; i < nums.length; i++) {
        nums[i]--;
    }
    for (let i = 0; i < nums.length;) {
        const k = nums[i];
        if (k === i) {
            i++;
            continue;
        }
        if (k < i) {
            nums[i] = nums[nums.length - 1];
            nums.pop();
            continue;
        }
        if (k > i) {
            if (k >= nums.length || k === nums[k]) {
                nums[i] = nums[nums.length - 1];
                nums.pop();
            } else {
                [nums[i], nums[k]] = [nums[k], nums[i]];
            }
        }
    }
    return nums.length + 1;
};
 
C++:
int firstMissingPositive(vector<int>& nums) {
        bool arr[100002] = {false};
        for(int i = 0; i != nums.size(); i++ ) {
            arr[min(max(nums[i], 0), 100001)] = true;
        }
        for(int i = 1; i < 100001; i++ ) {
            if(arr[i] == false) return i;
        }
        return 100001;       
    }

bài hard mà pass thì dễ điên, optimize mới khó
 
Last edited:
JavaScript:
function firstMissingPositive(nums: number[]): number {
    nums.sort((a, b) => a - b);
    let minPositive = 1;
    for (let num of nums) {
        if (num < 1 || num === minPositive - 1) continue;
        if (num > minPositive) return minPositive
        else minPositive++
    }
    return minPositive
};

JavaScript:
function firstMissingPositive(nums: number[]): number {
    const length = nums.length;
    // Handle negative
    for (let i = 0; i < length; i++) {
        if (nums[i] < 1) {
            nums[i] = length + 1;
        }
    }
    // Set valid position into negative
    for (let i = 0; i < length; i++) {
        const num = Math.abs(nums[i])
        if (num < length) {
            nums[num - 1] = Math.abs(nums[num - 1]) * -1 
        }
    }
    for (let i = 0; i < length; i++) {
        if (nums[i] > 0) return i + 1;
    }
    return length + 1
};
 
C++:
class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {

        int arr[100002] = {0};
        for(int num:nums){
            if(num<100002 && num > 0){
                arr[num] = 1;
            }
        }
        for(int i=1;i<100002;++i){
            if(arr[i] == 0)return i;
        }
        return 0;
    }
};
 
Lâu rồi vào lại, cảm giác Difficulty của Leetcode hiện tại dễ hơn trước đây phải k các bác (hơn 2 năm trước)

C#:
public class Solution {
    public int FirstMissingPositive(int[] nums) {
        var len = nums.Length;
        int temp;
        for(var i = 0; i < len; i++){
            if(nums[i] <= 0 || nums[i] >= len + 1) nums[i] = 0;
            else if(nums[i] != i + 1){
                if(nums[nums[i] - 1] == nums[i])
                    nums[i] = 0;
                else {
                    temp = nums[nums[i] - 1];
                    nums[nums[i] - 1] = nums[i];
                    nums[i] = temp;
                    i--;
                }
            }           
        }
        for(var i = 0; i < len; i++){
            if(nums[i] != i+ 1) return i+1;
        }
        return len + 1;
    }
}
 
Back
Top