目录
有效三角形个数

//先排序
Arrays.sort(nums);
//计算个数
int ret = 0;
int n = nums.length;
for(int i = n - 1 ; i >= 2 ; i--){
//定义左右指针
int left = 0;
int right = i - 1;
//判断大小
while(left < right){
if(nums[left] + nums[right] > nums[i]){
ret+= right - left;
right--;
}else{
left++;
}
}
}
return ret;
查找总价格为目标值的两个商品
这里的思路和上述的保持一致
但是值得注意的一点是
else 中的返回 会接受不到 所以要在最外层 再设置一个返回值
int left = 0 ;
int right = price.length - 1;
while(left < right){
if(price[left] + price [right] < target){
left++;
}else if(price[right] + price[left] > target){
right--;
}else{
return new int[]{price[left],price[right]};
}
}
return new int[]{0};
三数之和

List<List<Integer>> ret = new ArrayList<>();
//排序
Arrays.sort(nums);
int n = nums.length;
//deal wiith
for(int i = 0; i < n ;){
if(nums[i] > 0){
break;
}
int left = i + 1;
int right = n - 1;
int target = -nums[i];
while(left < right){
int sum = nums[left] + nums[right];
if(sum < target){
left++;
}else if(sum > target){
right--;
}else{
//找到存放
ret.add(new ArrayList<Integer>(Arrays.asList(nums[i],nums[left],nums[right])));
left++;
right--;
//去重
while(left<right && nums[left] == nums[left-1]){
left++;
}
while(left<right && nums[right] == nums[right+1]){
right--;
}
}
}
//去重i
i++;
while(i < n && nums[i] == nums[i-1]){
i++;
}}
return ret;
四数之和

List<List<Integer>> ret = new ArrayList<>();
//排序
Arrays.sort(nums);
//
int n = nums.length;
for(int i = 0; i < n ;){
for(int j = i+1 ; j < n;){
int left = j + 1 ;
int right = n - 1;
long target1 = (long) target - nums[i] - nums[j];
while(left<right){
int sum = nums[right] + nums[left];
if(sum > target1){
right--;
}else if(sum < target1){
left++;
}else{
ret.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right]));
left++;
right--;
//去重
while(left < right && nums[left] == nums[left - 1]){
left++;
}
while(left < right && nums[right] == nums[right + 1]){
right--;
}
}
}
//去重 I J
j++;
while(j < n && nums[j] == nums[j - 1]){
j++;
}
}
i++;
while(i < n && nums[i] == nums[i - 1]){
i++;
}
}
return ret;