题目:两数之和


两数之和  



27%
通过

给一个整数数组,找到两个数使得他们的和等于一个给定的数target。

你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是1到n,不是以0开头。

您在真实的面试中是否遇到过这个题?

Yes





样例

numbers=[2, 7, 11, 15],  target=9

return [1, 2]

注意

你可以假设只有一组答案。
标签 Expand   



相关题目 Expand  



解题思路:
解法1:O(n^2)时间复杂度


public class Solution {
    /*
     * @param numbers : An array of Integer
     * @param target : target = numbers[index1] + numbers[index2]
     * @return : [index1 + 1, index2 + 1] (index1 < index2)
     */
    public int[] twoSum(int[] numbers, int target) {
        // write your code here
         if(null==numbers||2>numbers.length) return null;
         int[] res  = new int[2];
         for(int i=0;i<numbers.length;i++){
              for(int j=1;j<numbers.length;j++){
                   if(numbers[i]+numbers[j]==target){
                        res[0] = i+1;
                        res[1] = j+1;
                        return res;
                   }
              }
         }
              return res;
    }
}


<span><span style="font: 32px/normal 华文楷体; color: rgb(77, 206, 29); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">解法2:双指针O(N^logN)时间复杂度,O(N)空间复杂度</span></span>

public class Solution {
    /*
     * @param numbers : An array of Integer
     * @param target : target = numbers[index1] + numbers[index2]
     * @return : [index1 + 1, index2 + 1] (index1 < index2)
     */
    public int[] twoSum(int[] numbers, int target) {
        // write your code here
          if (null == numbers || 2 > numbers.length)
               return null;
          int[] res = new int[2];
          ArrayList<Integer>  tmp = new ArrayList<>();
          for(int i=0;i<numbers.length;i++){
               tmp.add(numbers[i]);
          }
          Collections.sort(tmp);
          int s = 0;
          int e = numbers.length - 1;
          while (s < e) {
               if (tmp.get(s)+tmp.get(e) == target) {                   
                    break;
               } else if (tmp.get(s)+tmp.get(e) > target) {
                    e--;
               } else {
                    s++;
               }
          }
          if(s<e){
               res = findIndex(numbers, tmp.get(s), tmp.get(e));
                              return res;
          }else{
               return null;
          }
     }
     public int[] findIndex(int[] numbers,int add1,int add2){
          int[] res = new int[2];
          int count = 0;
          for(int i=0;i<numbers.length;i++){
               if(numbers[i]==add1||numbers[i]==add2){
                    res[count++] = i+1;
               }
          }
          return res;
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值