leetcode 41 缺失的第一個正數

思路很簡單,找出最大正數和最小正數,然後建立一個數組visit,記錄從最小正數到最大正數之間哪些數有,哪些數沒有。最後遍歷一下visit就行了。不過visit的長度需要注意一下。舉個簡單的例子,nums = [1,4,5,1000]。很顯然,缺失的最小整數爲3。在new一個數組visit記錄1到1000哪些數存在與否有點技巧。你可以直接new長度1000的數組,但如果最大元素太大,內存開銷會不足。此時,你只需要new一個長度爲 4-1+1長度的數組。爲什麼不是new一個長度爲 5-1+1長度的數組呢?假設nums中原來的數是連續的,nums=[1,2,3,4],所以如果nums中存在缺失,一定就在前4個數(nums中正數個數的長度)裏面。 

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int maxele = -INT_MAX;//記錄最大正數
        int minele = INT_MAX;//記錄最小正數
        int n = 0;//記錄正數的個數
        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] > 0) {
                n++;
                if (nums[i] > maxele)
                    maxele = nums[i];
                if (nums[i] < minele)
                    minele = nums[i];
            }
        }
        if (minele > 1)
            return 1;
        int temp = -1;
        /*尋找nums中減去最小元素的值小於正數個數n的最大元素。
          如nums = [1,2,4],正數個數n=3,4-1=n,2-1<n,1-1<n。2爲查找得到的元素。
          new一個動態數組,len=2-1+1爲數組長度*/
        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] > 0 && nums[i] - minele < n && nums[i] - minele > temp)
                temp = nums[i] - minele;
        }     
        //visit數組長度      
        int len = temp + 1;
        int *visit = new int[len];
        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] > 0 && nums[i] - minele < n)
                visit[nums[i] - minele] = 1;
        }
        //如果在visit裏面,可以找到一個數缺失,return這個數
        for (int i = 0; i < len; i++)
            if (visit[i] != 1)
                return i + minele;
        //否則,這個數在visit外,越界1
        return len + minele;
    }
};

 

發佈了115 篇原創文章 · 獲贊 16 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章