• LeetCode 167. 两数之和 II


    思路

    方法一:二分查找

    在数组中找到两个数,使得它们的和等于目标值,可以首先固定第一个数,然后寻找第二个数,第二个数等于目标值减去第一个数的差。利用数组的有序性质,可以通过二分查找的方法寻找第二个数。为了避免重复寻找,在寻找第二个数时,只在第一个数的右侧寻找。

     1 class Solution {
     2 public:
     3     vector<int> twoSum(vector<int>& numbers, int target) {
     4         for(int i = 0; i < numbers.size(); ++i) {
     5             int x = target - numbers[i];
     6             //二分查找x
     7             int left = i+1, right = numbers.size()-1;
     8             while(left <= right) {
     9                 int mid = (left + right)/2;
    10                 if(numbers[mid] < x) {
    11                     left = mid + 1;
    12                 } else if(numbers[mid] > x) {
    13                     right = mid - 1;
    14                 } else {
    15                     return vector<int>({i+1, mid+1});
    16                 }
    17             }
    18         }
    19 
    20         return vector<int>();
    21     }
    22 };

    方法二:首尾双指针

    初始时两个指针分别指向第一个元素位置和最后一个元素的位置。每次计算两个指针指向的两个元素之和,并和目标值比较。如果两个元素之和等于目标值,则发现了唯一解。如果两个元素之和小于目标值,则将左侧指针右移一位。如果两个元素之和大于目标值,则将右侧指针左移一位。移动指针之后,重复上述操作,直到找到答案。

     1 class Solution {
     2 public:
     3     vector<int> twoSum(vector<int>& numbers, int target) {
     4         int i = 0, j = numbers.size() - 1;
     5         while(i < j) {  //题目有解,i不可能越过j
     6             if(numbers[i] + numbers[j] < target) {
     7                 ++i;
     8             } else if(numbers[i] + numbers[j] > target) {
     9                 --j;
    10             } else {
    11                 return vector<int>({i+1, j+1});
    12             }
    13         }
    14 
    15         return vector<int>();
    16     }
    17 };

  • 相关阅读:
    Spring Boot之@ImportResource、配置类、占位符表达式
    Spring Boot之测试类报错问题
    Spring Boot之@EnableAutoConfiguration源码解读
    Spring Boot之第一个程序及执行原理。
    eclipse中git使用中的冲突解决
    python画国旗
    第十六周进度
    个人课程总结
    人月神话之阅读笔记03
    第十五周进度
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/14462456.html
Copyright © 2020-2023  润新知