• 【Leetcode 167】Two Sum II


    问题描述:给出一个升序排列好的整数数组,找出2个数,它们的和等于目标数。返回这两个数的下标(从1开始),其中第1个下标比第2个下标小。

    Input: numbers={2, 7, 11, 15}, target=9
    Output: index1=1, index2=2

    分析:在排序好的数组中进行查找,很容易想到用二分查找的思想。这里相当于是二分查找两个数,可以把最小值和最大值作为起点求和(sum)。

    若sum<target,则需要把较小元素也就是low处元素变大,此时不能直接把mid赋值给low,因为假如numbers[mid] + numbers[high] > target,那么可能存在这两个数一个在(low, mid)区域一个在[mid, high]区域的情况,也就是一个小于numbers[mid]的数x满足x + numbers[high] == target成立,此时直接让low向高位进一格即可。

    sum>target的情况同样。

    解法:

        vector<int> twoSum(vector<int>& numbers, int target) {
            int low = 0;
            int high = numbers.size() - 1;
            while (low < high) {
                int mid = (low + high) >> 1;
                long sum = numbers[low] + numbers[high];
                if (sum == target)
                    return vector<int>{low + 1, high + 1};
                else if (sum > target)
                    high = (numbers[low] + numbers[mid] > target) ? mid : high - 1;
                else
                    low = (numbers[mid] + numbers[high] <= target) ? mid : low + 1;
            }
            return vector<int>();
        }

    比较极端的情况是每次不能移动到二分位置,而是只能进1位或退位,也就是达到O(n)。

    但是试了下很难举出这种极端情况的例子,突然直观地觉得好像很难到达O(n)的复杂度……好像还是O(logn)……数学不太好,证明等以后去讨论区看看吧

  • 相关阅读:
    [LeetCode] 85. 最大矩形
    [LeetCode] 84. 柱状图中最大的矩形
    [LeetCode] 83. 删除排序链表中的重复元素
    [LeetCode] 81. 搜索旋转排序数组 II
    [LeetCode] 82. 删除排序链表中的重复元素 II
    [LeetCode] 80. 删除排序数组中的重复项 II
    [LeetCode] 79. 单词搜索
    [LeetCode] 77. 组合
    转:快乐Node码农的十个习惯
    转:zookeeper3.4.5安装笔记
  • 原文地址:https://www.cnblogs.com/Harley-Quinn/p/5836149.html
Copyright © 2020-2023  润新知