leetcode167:两数之和|| - 输入有序数组

题目链接:167. 两数之和 II - 输入有序数组 - 力扣(LeetCode)

复制代码
class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        int left = 0, right = numbers.size() - 1;
        while(left <= right)
        {
            if(numbers[right] == target - numbers[left])
            {
                return {left + 1, right + 1};
            }
            else if(numbers[right] > target - numbers[left])
            {
                right--;
            }
            else
            {
                left++;
            }
        }
        return {-1, -1};
    }
};

这个题目,其实有两复杂度的算法,一个是nlogn 一个是n 我这个代码复杂度是n

为什么这道题要用复杂度为n呢,其实我们分析一下nlogn和n谁大,这个是要分区间来讨论的,首先当n < 10的时候,nlogn肯定小于n, 当n = 10的时候,两个相等,当n大于10的时候,这时候nlogn是大于n的,所以来看,我们这道题实际上用复杂度n会更好

代码讲解:这个题目实际上就是和双指针的结合,这个代码为什么我要用 numbersright > target - numbersleft而不是用numbersright + numbersright > target,这个问题也就好比我们用二分的时候,用left + (right - left) / 2 而不是用(left + right)/ 2这个道理是一样的,为了防止加法超出int范围

这个代码就是把left定在数组的最左边,right定在数组的最后边,然后去寻找,当numbersleft + numbersright > target 的时候,这个时候肯定是让right--,因为你想想,你要是right++,那必定是大于target的,同理numbersleft + numbersright < target的道理一样。

相关推荐
启观川4 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
码爸4 小时前
排序算法介绍
python·算法·排序算法
Interview Aid1125 小时前
SoFi 面试流程全解析:技术面试、OA 与备考指南
面试·职场和发展
动词ing6 小时前
【题目练习】算法 组合总和||
算法
longlongzihan6 小时前
链表找环:Floyd 判圈算法(LeetCode 141 & 142 )
c++·算法·leetcode·链表
专业程序开发源6 小时前
flask家电故障预测系统92491-计算机课程设计/毕业设计
vscode·python·sql·算法·flask·课程设计
Logic1016 小时前
C语言/数据结构欧几里得算法题解:长方形切割最大正方形——贪心划分计数
c语言·数据结构·算法·贪心算法·时间复杂度·空间复杂度·欧几里得算法
yi0116 小时前
LeetCode 643. 子数组最大平均数 I|从暴力枚举到滑动窗口
人工智能·笔记·python·算法·leetcode·滑动窗口
YangYang9YangYan7 小时前
2027数学与应用数学转产品经理:面试解释与项目准备
面试·职场和发展·产品经理
极光通讯7 小时前
服务器内存来料检验(IQC)实操:批次追溯、外观判定与上机验证
java·服务器·算法