由于手滑

DAY7的没保存

假装DAY7已经上传了。

BM52 数组中只出现一次的两个数字

class Solution {
private:
    int a[1000001];
    vector<int> b;
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型vector 
     * @return int整型vector
     */
    vector<int> FindNumsAppearOnce(vector<int>& array) {
        // write code here
        memset(a,0,sizeof(a));
        for(int i=0;i<array.size();i++){
            a[array[i]]++;
        }
        for(int i=0;i<1000001;i++){
            if(a[i]==1){
                b.push_back(i);
            }
        }
        return b;
    }
};

BM53 缺失的第一个正整数

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int minNumberDisappeared(vector<int>& nums) {
        // write code here
        sort(nums.begin(), nums.end());
        int k=1;
        for(int i=0;i<nums.size();i++){
            if(nums[i]<=0){
                continue;
            }else if(nums[i]==k){
                k++;
            }else{
                return k;
            }
        }
        return k;
    }
};

BM54 三数之和

class Solution {
public:
    vector<vector<int> > threeSum(vector<int>& num) {
        vector<vector<int>> ans;
        if (num.size() < 3) //个数不满足的时候明显不符合要求,返回结果。
            return ans;
        sort(num.begin(), num.end()); //对给定的数组进行排序
 
        for (int i = 0; i < num.size() - 2; i++) //-2是因为保证从i开始剩下的数组长度>=3
        {
            if (num[i] > 0)       //基准值大于0 ,后面查找的两个数肯定不存在。
                break;
            int j = i+1, k = num.size() - 1; //j从i后面的第一个数开始尝试,k从数组最后一个位置开始尝试
            int target = -num[i];     //寻找两个数相加为target
            while (j<k)
            {
                if (num[j] + num[k] < target) //说明寻找的两个数比目标值小,所以尝试更大的一种情况。
                    j++;
                else if (num[j] + num[k] > target)//说明比目标值大,尝试更小的一种情况
                    k--;
                else                       //相等的状况。
                {
                    vector<int> temp = {num[i],num[j],num[k]};
                    ans.push_back(temp);
                    //target=num[j]+num[k]   target一定时,确定了num[j]、num[k] 其中一个那么另外一个就确定了  那么得到的肯定就会重复
                    //所以下面两行代码是为了去掉当target一定时 重复的情况
                    while (num[j] == num[j + 1] && j+1<k)    j++;
                    while (num[k] == num[k - 1] && k-1>j)  k--;
                    ++j; --k;      //相等的话这两个数就不再使用了(已经用过了)。
                }
            }
            //为了去除target重复的情况,试想一下,当num[i]=x的时候, i后面所有相加=-x 的两个数已经全部求出来了。
            //那再求i+1 后面的必然是上面所求的子集。 这里依旧还是需要判断i,因为防止后面再次判断num[i+1]的时候产生越界。
            while (num[i] == num[i + 1] && i < num.size() - 2)   i++;
        }
        return ans;
 
    }
};

BM55 没有重复项数字的全排列

class Solution {
public:
    void recurion(vector<vector<int>>& res,vector<int>& num,int index){
        if(index==num.size()-1)
            res.push_back(num);
        else{
            for(int i=index;i<num.size();i++){
                swap(num[i],num[index]);
                recurion(res,num, index+1);//每次递归index增加,避免重复排列
                swap(num[i], num[index]);
            }
        }
    }
    vector<vector<int> > permute(vector<int> &num) {
        sort(num.begin(), num.end());
        vector<vector<int>> res;
        recurion(res, num, 0);
        return res;
    }
};

BM56 有重复项数字的全排列

class Solution {
public:
    void recurion(vector<vector<int>>& res,vector<int>& num,int index){
        if(index==num.size()-1)
            res.push_back(num);
        else{
            for(int i=index;i<num.size();i++){
                swap(num[i],num[index]);
                recurion(res,num, index+1);//每次递归index增加,避免重复排列
                swap(num[i], num[index]);
            }
        }
    }
    vector<vector<int> > permuteUnique(vector<int> &num) {
        sort(num.begin(), num.end());
        vector<vector<int>> res;
        recurion(res,num,0);
        sort(res.begin(), res.end());//对结果进行排序,排序后进行去重操作,利用unique函数进行去重操作。
        res.erase(unique(res.begin(), res.end()), res.end());
        return res;
    }
};