目录
[11. 盛最多水的容器 - 力扣(LeetCode)](#11. 盛最多水的容器 - 力扣(LeetCode))
[15. 三数之和 - 力扣(LeetCode)](#15. 三数之和 - 力扣(LeetCode))
11. 盛最多水的容器 - 力扣(LeetCode)
思路:刚以看到这个问题的时候,直接用两层循环,这种解法是把所有的情况都算出来,这种时间的复杂度是n方,但是看到题解的思路,自己大致明白双指针思路,一个指针直到开始,一个结尾直到结尾,比较两个指针的高度,如果那个高度比较低,指针向前或者向后,大的指针不动,
class Solution {
public int maxArea(int[] height) {
//数组为空
if(height==null||height.length==0){
return 0;
}
int i=0,j=height.length-1;
int result=0;
//使用双指针进行解决
while(i<j){
result=Math.max(result,(j-i)*Math.min(height[i],height[j]));
if(height[i]<height[j]){
i++;
}else{
j--;
}
}
return result;
}
}
15. 三数之和 - 力扣(LeetCode)
大体思路:
1.对数组进行排序,方便取数和去重,
- i的起始为0,定一个下标left 定义在i+1的位置上,定义下标right 在数组结尾的位置上。
a 为 nums[i] b为nums[left] c为nums[right]
找到a,进行去重
- 接下来如何移动left 和right呢, 如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是排序后了,所以right下标就应该向左移动,这样才能让三数之和小一些。
如果 nums[i] + nums[left] + nums[right] < 0 说明 此时 三数之和小了,left 就向右移动,才能让三数之和大一些,直到left与right相遇为止。
找到left 和right后,进行去重
主要的就是去重:
//a的去重
if(i>0&&nums[i]==nums[i-1]){
continue;
}
例子:{-1,-1,-2,3}
这么写就是当前使用 nums[i],我们判断前一位是不是一样的元素,在看{-1,-1,-2,3}这组数据,当遍历到 第二个 -1 的时候,只要前一位没有-1,那么 {-1, -2,3} 这组数据一样可以收录到 结果集里。若是nums[i]==nums[i+1]的话,遍历到 第一个 -1 的时候 ,结果{-1,-2,3} 这组数据会直接跳过**,不会进入结果集**
//right去重
while(right>left &&nums[right]==nums[right-1]) right--;
//left 去重
while(right>left &&nums[left]==nums[left+1]) left++;
{0,-1,-1,-1,-1,1,1,1,1}
例子中有大量重复的-1和1 ,去重后结果{0,-1,1}
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result=new ArrayList<>();
//进行排序
Arrays.sort(nums);
int length=nums.length;
for(int i=0;i<length;i++){
if(nums[i]>0){
return result;
}
//a去重
if(i>0&&nums[i]==nums[i-1]){
continue;
}
int left=i+1;
int right=length-1;
//进行双指针
while(left<right){
if(nums[i]+nums[left]+nums[right]>0){
right--;
}else if(nums[i]+nums[left]+nums[right]<0){
left++;
}else{
//加入结果集
result.add(Arrays.asList(nums[i],nums[left],nums[right]));
//left去重
while(left<right && nums[left]==nums[left+1]) left++;
//right去重
while(left<right && nums[right]==nums[right-1]) right--;
//进入到真正的取数
left++;
right--;
}
}
}
return result;
}
}