1.两数之和
class Solution {
public int[] twoSum(int[] nums, int target) {
int n = nums.length;
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
if (nums[i] + nums[j] == target) {
return new int[]{i, j};
}
}
}
return new int[0];
}
}
15.三数之和
双指针法,关键:去重
class Solution {
public static List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> ans=new ArrayList<List<Integer>>();
int size=nums.length;
if(size<3) return ans;
Arrays.sort(nums); //排序
for(int i=0;i<size-2;i++){
if(i>0 && nums[i]==nums[i-1]) continue; //去重1
if(nums[i]>0) break; //第一个大于0,后面肯定都比0大
int left=i+1,right=size-1; //双指针
int target=-nums[i];
while(left<right){
if(nums[left]+nums[right]==target){
ans.add(new ArrayList<>(Arrays.asList(nums[i],nums[left],nums[right]))); //将数组转化为list
left++;
right--;
while(left<right && nums[left]==nums[left-1]) left++; //去重2
while(left<right && nums[right]==nums[right+1]) right--; //去重3
}
else if(nums[left]+nums[right]>target){
right--;
}
else if(nums[left]+nums[right]<target){
left++;
}
}
}
return ans;
}
}
16.最接近的三数之和
class Solution {
public int threeSumClosest(int[] nums, int target) {
int size=nums.length;
Arrays.sort(nums);
int best=1000;
for(int i=0;i<size;i++){
if(i>0 && nums[i]==nums[i-1]) continue;
int l=i+1,r=size-1;
while(l<r){
if(nums[i]+nums[l]+nums[r]==target){
return target;
}
int sum=nums[i]+nums[l]+nums[r];
if(Math.abs(sum-target)<Math.abs(best-target)){
best=sum;
}
if (sum>target) {
// 如果和大于 target,移动 c 对应的指针
int r0=r-1;
// 移动到下一个不相等的元素
while (l<r0 && nums[r0]==nums[r]) {
--r0;
}
r=r0;
}
else {
// 如果和小于 target,移动 b 对应的指针
int l0=l+1;
// 移动到下一个不相等的元素
while (l0<r && nums[l0]==nums[l]) {
++l0;
}
l=l0;
}
}
}
return best;
}
}
18.四数之和
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
int size=nums.length;
List<List<Integer>> ans=new ArrayList<List<Integer>>();
if(size<4) return ans;
Arrays.sort(nums); //排序
for(int i=0;i<size-3;i++){
if(i>0 && nums[i]==nums[i-1]) continue; //去重
if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target) break;
if(nums[i]+nums[size-3]+nums[size-2]+nums[size-1]<target) continue;
for(int j=i+1;j<size-2;j++){
if(j>i+1 && nums[j]==nums[j-1]) continue;
if(nums[i]+nums[j]+nums[j+1]+nums[j+2]>target) break;
if(nums[i]+nums[j]+nums[size-2]+nums[size-1]<target) continue;
int l=j+1,r=size-1;
while(l<r){
int sum=nums[i]+nums[j]+nums[l]+nums[r];
if(sum==target){
ans.add(Arrays.asList(nums[i],nums[j],nums[l],nums[r]));
while(l<r && nums[l]==nums[l+1]) l++;
l++;
while(l<r && nums[r]==nums[r-1]) r--;
r--;
}
else if(sum<target){
l++;
}
else{
r--;
}
}
}
}
return ans;
}
}