Leetcode之2Sum问题

来源:互联网 发布:东莞数据恢复 dgfix 编辑:程序博客网 时间:2024/06/15 18:33

问题描述:

       给定一个整数数组,找出在数组中两个数字相加的和等于给定数字的下标,例如,对于输入数组为[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;       }




原创粉丝点击