全排列与盛最多水的容器
·
核心逻辑:使用回溯算法处理进行还原
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;
}
};
关键操作:
- 先对数组排序:让相同的元素相邻,这样才能方便地判断并跳过重复元素。
- 添加去重条件:在遍历元素时,如果当前元素和前一个元素相同,且前一个元素没有被使用(说明是同一层的重复选择),则跳过当前元素
在初始时,左右指针分别指向数组的左右两端,它们可以容纳的水量为 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;
}
};
更多推荐
所有评论(0)