Leetcode之2Sum问题

问题描述:

       给定一个整数数组,找出在数组中两个数字相加的和等于给定数字的下标,例如,对于输入数组为[2,7,11,15],指定的数字为9,因为2+7=9,所以最后返回的是2和7对应的下标[0,1]

       该问题可以通过map数据类型来实现,map的key表示当前数组第i个位置的数字的值,value值存储当前位置i,在遍历数组的过程中,如果发现在map中包含了key值为target-a[i]的键,那么此时只需要找到对应的value就是我们要求的下标。具体的代码实现如下:

//利用map来解决这个问题
	 public int[] twoSum(int[] nums, int target){
		 
		 int [] index=new int[2];
		 Map<Integer,Integer> p=new HashMap<Integer,Integer>();
		 for(int i=0;i<nums.length;i++){
			 if(p.containsKey(target-nums[i])){
				 index[0]=i;
				 index[1]=p.get(target-nums[i]);
				 Arrays.sort(index);
				 return index;
			 }
			 p.put(nums[i], i);
		 }
		 return index;
		 
	 }
       此问题也可以通过查找的方法来实现,我们可以现在数组中找到相加的值为target的两个数字,再根据数字找到对应的下标即可,首先对数组进行排序,在这里需要一个辅助数组来存储原始数组。对排序之后的数组设置两个指针i,j,指针i指向数组的第一个元素,另一个指针j指向数组的最后一个元素,如果此时a[i]+a[j]==target的话,那么这是的两个数字就是我们需要找的数字,如果a[i]+a[j]<target的话,说明二者的和太小,此时需要移动i指针,如果a[i]+a[j]>target的话,说明现在的和太大,此时需要移动j指针,在找到满足条件的两个数字之后,此时再遍历辅助数组,从辅助数组中找到这两个数字对应的下标,具体的代码如下所示:

//利用双指针的方法解决数组中两个数字相加和为某一个target的问题
	 public int[] twoSum(int[] nums, int target) {
		 if(nums==null||nums.length==0){
			 return null;
		 }
		 int []nums2=Arrays.copyOf(nums, nums.length);
		 Arrays.sort(nums);
		 int j=nums.length-1;
		 int i=0;
		 int [] r=new int[2];
		 while(i<j){
			 if(nums[i]+nums[j]==target){
				 r[0]=nums[i];
				 r[1]=nums[j];
				 break;
			 }else if(nums[i]+nums[j]<target){
				 i++;
			 }else if(nums[i]+nums[j]>target){
				 j--;
			 }
		 }
		 
		 int []index=new int[2];
		 for(int k=0;k<nums2.length;k++){
			 if(nums2[k]==r[0]){
				 index[0]=k;
				 break;
			 }
		 }
		 for(int l=nums2.length-1;l>0;l--){
			 if(nums2[l]==r[1]){
				 index[1]=l;
				 break;
			 }
		 }
		 return index;   
	    }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值