首页 > 编程语言 > 详细

p3 在有序数组中求两数之和(对leetcode1 的改编)

时间:2020-03-05 21:59:26      阅读:48      评论:0      收藏:0      [点我收藏+]

一:解题思路

这个题目是在p2的基础上有了一点改动,将数组变成了递增有序的。其解法可以完全和p2一样。但是有没有更好的解法呢?将时间复杂度和空间复杂度都降低呢?答案是:当然有的!因为给定的数组的递增的,所以我们可以利用二分搜索和双指针的思想。1.我们用2个指针分别指向数组的首部和尾部,分别定义为首指针和尾指针。2.将首指针和尾指针所对应的数组元素分别相加,如果得到的和大于目标值,那么就要把尾指针--,如果和小于目标值,那么就要把首指针++。这个方法只需要遍历一遍数组,没有使用额外的存储空间,因此时间复杂度为O(n),空间复杂度为O(1)。

二:完整代码示例 (C++版和Java版)

C++98/03

class Solution 
{
public:
    vector<int> twoSum(vector<int>& numbers, int target) 
    {
        vector<int> ret(2,-1);

        int i = 0, j = numbers.size() - 1;

        while (i < j)
        {
            if (numbers[i] + numbers[j] > target)
            {
                j--;
            }
            else if (numbers[i] + numbers[j] < target)
            {
                i++;
            }
            else
            {
                ret[0] = i + 1;
                ret[1] = j + 1;
                break;
            }
        }

        return ret;
    }
};
C++11:
class Solution 
{
public:
    vector<int> twoSum(vector<int>& numbers, int target) 
    {
        vector<int> ret = { -1,-1 };

        int i = 0, j = numbers.size() - 1;

        while (i < j)
        {
            if (numbers[i] + numbers[j] > target)
            {
                j--;
            }
            else if (numbers[i] + numbers[j] < target)
            {
                i++;
            }
            else
            {
                ret = {i+1,j+1};
                break;
            }
        }

        return ret;
    }
};
Java版本:
class Solution 
{
    public int[] twoSum(int[] numbers, int target) 
    {
          int i=0,j=numbers.length-1;
          
          while(i<j)
          {
              if(numbers[i]+numbers[j]>target)
              {
                  j--;
              }
              else if(numbers[i]+numbers[j]<target)
              {
                  i++;
              }
              else
              {
                  return new int[]{i+1,j+1};
              }
          }
          
          return new int[]{-1,-1};
    }
}

p3 在有序数组中求两数之和(对leetcode1 的改编)

原文:https://www.cnblogs.com/repinkply/p/12422732.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!