全排列二

核心逻辑:使用回溯算法处理进行还原

class Solution {
public:
    vector<vector<int>> res;
    bool isuse[10] = {0};
    void dfs(vector<int>& nums,vector<int>& t)
    {
        if(t.size()==nums.size())
        {
            res.push_back(t);
            return;
        }
        for(int i = 0;i<nums.size();i++)
        {
            if(isuse[i]||(i>0&&nums[i] == nums[i-1] && !isuse[i-1]))
            {
                continue;
            }
            t.push_back(nums[i]);
            isuse[i]=1;
            dfs(nums,t);
            t.pop_back();
            isuse[i] = 0;
            
        }
    }
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        vector<int> t;
        sort(nums.begin(), nums.end());
        int size = nums.size();
        dfs(nums,t);
        return res;
    }
};

关键操作:

  1. 先对数组排序:让相同的元素相邻,这样才能方便地判断并跳过重复元素。
  2. 添加去重条件:在遍历元素时,如果当前元素和前一个元素相同,且前一个元素没有被使用(说明是同一层的重复选择),则跳过当前元素

盛最多水的容器

在初始时,左右指针分别指向数组的左右两端,它们可以容纳的水量为 min(1,7)∗8=8。

此时我们需要移动一个指针。移动哪一个呢?直觉告诉我们,应该移动对应数字较小的那个指针(即此时的左指针)。这是因为,由于容纳的水量是由

两个指针指向的数字中较小值∗指针之间的距离
决定的。如果我们移动数字较大的那个指针,那么前者「两个指针指向的数字中较小值」不会增加,后者「指针之间的距离」会减小,那么这个乘积会减小。因此,我们移动数字较大的那个指针是不合理的。因此,我们移动 数字较小的那个指针。

class Solution {
public:
    int maxArea(vector<int>& height) {
        int maxnum = 0;
        int l =0,r = height.size()-1;
        while(l!=r)
        {
            int t = height[l]<=height[r]?height[l] : height[r];
            maxnum = max(maxnum,t*(r-l));
            if(height[l]<=height[r])
            {
                l++;
            }
            else{
                r--;
            }
        }
        return maxnum;
    }
};

更多推荐