Leetcode 两数之和,三树之和,四数之和

两数之和的思想比较简单啦 就是 使用一个map存储其值,然后将其下标返回即可;
三数之和 ,四数之和的思想比较类似,就是使用双指针的思想:
三数之和的代码如下所示:
四数之和的代码如下:有一些优化
四数之和是在三数之和的基础上增加了一层循环,

class Solution {    
	public List<List<Integer>> fourSum(int[] nums, int target) {        
	//先对数组进行排序        
	Arrays.sort(nums);        
	//是不是可以借鉴三树之和;        
	//相当于在三数之和外面再套一层循环        
	int sum=0;        
	int len=nums.length;        
	List<List<Integer>> res=new ArrayList<>();        
	//对边界d值的判断        
	if(len==0||len<4) return res;          
	for(int i=0;i<len-3;i++){                    
		if(i>0&&nums[i]==nums[i-1]) continue;                       
		//这里增加判断最大值和最小值的            
		int min1=nums[i]+nums[i+1]+nums[i+2]+nums[i+3];            
		if(min1>target){                
			break;            
			}            
		//获取当前最大值            
		int max1=nums[len-1]+nums[len-2]+nums[len-3]+nums[len-4];            
		if(max1<target) break;            
		for(int j=i+1;j<len-2;j++){                            
		if(j>i+1&&nums[j]==nums[j-1]) continue;                
		int l=j+1;                int r=len-1;                
		int max=nums[len-1]+nums[len-2]+nums[len-3];                
		if(max<target-nums[i]) break;                
		int min=nums[j]+nums[j+1]+nums[j+2];                
		if(min>target-nums[i]) break;                
		while(l<r){                    
			sum=nums[j]+nums[l]+nums[r]+nums[i];                    
			if(sum==target){                        
				res.add(Arrays.asList(nums[i],nums[j],nums[l],nums[r]));                        
				while(l<r&&nums[l]==nums[l+1]) l++;                        
				while(l<r&&nums[r]==nums[r-1]) r--;                        
				l++;                        
				r--;                    
				}                    
				if(sum<target){                       
				  l++;                    
				  }                    
				if(sum>target){                        
				  r--;                    
				  }                
				 }            
				}        
			}        
		return res;    
		}
	}

你可能感兴趣的:(leetcode刷题)