首页 > 其他分享 >剑指 Offer 57. 和为s的两个数字

剑指 Offer 57. 和为s的两个数字

时间:2023-06-02 15:34:26浏览次数:45  
标签:right target nums 57 Offer 指针 元素 left 数字

剑指 Offer 57. 和为s的两个数字

题目:

输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。

示例1:

输入:nums = [2,7,11,15], target = 9
输出:[2,7] 或者 [7,2]

示例2:

输入:nums = [10,26,30,31,47,60], target = 40
输出:[10,30] 或者 [30,10]

限制:

  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^6

</br></br>

思路一:

双指针法。

定义两个指针分别指向数组的首元素和尾元素,然后让两个指针指向的元素相加和target比较大小并根据比较结果移动指针,情况分为以下几种:

  • 如果两边指针指向的元素相加比target大,即nums[left] + nums[right] > target,那此时需要向左移动right指针,即right--

  • 如果两边指针指向的元素相加比target小,即nums[left] + nums[right] < target,那此时需要向右移动left指针,即left++

  • 如果两边指针指向的元素相加和target大小相等,即nums[left] + nums[right] = target,此时直接返回这两个指针对应的元素;

  • 如果遍历结束之后仍然没有找到,说明数组中元素相加没有等于target的,那么返回{0,0}

代码如下:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1;
        //两边相加之后和target比较大小
        while(left < right)
        {
            //如果比target大,右边指针--
            if(nums[left] + nums[right] > target)
            {
                right--;
            }
            //如果比target小,左边指针++
            else if(nums[left] + nums[right] < target)
            {
                left++;
            }
            //相等时直接返回
            else 
            {
                return {nums[left],nums[right]};
            }
        }
        return {0,0};
    }
};

时间复杂度:O(N)

空间复杂度:O(1)

标签:right,target,nums,57,Offer,指针,元素,left,数字
From: https://blog.51cto.com/u_15562309/6403009

相关文章

  • 升级全面预算管理,引领企业数字化之旅
    当今这个科技飞速发展的时代,企业需要完成数字化改革,以提升自身利润,但是企业却并没有花费足够多的时间去思考如何更好地利用技术来改善自己的业务。只有少部分企业领导者对企业当前的财务和业务计划或者未来的数字化转型计划充满信心。也就是说,大部分企业仍然在不断变化的数字世界中......
  • 算法刷题记录:日历中的数字
    题目链接https://ac.nowcoder.com/acm/contest/19859/B题目分析很简单的一道数位统计的题目其中年和月是乘法原理。(固定住年和月,枚举该月有几天,所以是乘法原理)当x=0并且month<10时,月需要特判一位数的情况,是加法原理日是加法原理AC代码//Problem:日历中的数字//Cont......
  • Java官方笔记5数字和字符串
    NumbersNumber的子类:另外还有BigDecimal和BigInteger,用于高精度计算,AtomicInteger和AtomicLong用于多线程应用。我们有时候需要用包装类而非基本数据类型,理由如下:方法入参类型为Object,只能传入对象使用包装类提供的常量,比如MIN_VALUE和MAX_VALUE使用包装类的方法来做......
  • [SDOI2017]数字表格
    题意求如下表达式的值\[\prod_{i=1}^{n}\prod_{j=1}^{m}f_{gcd(i,j)}\pmod{10^9+7}\]其中,\(f_i\)为fibonacci数列的第\(i\)项,\(n,m\leqslant10^6\)Solution\[\prod_{i=1}^{n}\prod_{j=1}^{m}f_{gcd(i,j)}\]改变枚举顺序,优先枚举\(d=gcd(i,j)\),\[=\prod_{d=1}......
  • 剑指 Offer II 048. 序列化与反序列化二叉树
    题目链接:剑指OfferII048.序列化与反序列化二叉树方法:先序遍历(dfs)解题思路 在先序遍历过程中,节点值之间通过空格隔开,好利于后续反序列化过程中获取值。代码classCodec{public://Encodesatreetoasinglestring.stringserialize(TreeNode*root){......
  • leetcode 65. 有效数字 66. 寻找两个正序数组的中位数
    leetcode65.有效数字66.寻找两个正序数组的中位数65.有效数字难度困难295有效数字(按顺序)可以分成以下几个部分:一个小数或者整数(可选)一个'e'或'E',后面跟着一个整数小数(按顺序)可以分成以下几个部分:(可选)一个符号字符('+'或'-')下述格式之一:至少一位数字,后面跟着一个......
  • 企业数字化转型的数据在哪里找?
    企业数字化转型的数据主要来自于两个方面,一个是通过工业物连的方式直接采集到的工业设备、传感器等参与生产制造物流运输各方面的生产数据及工况数据等,另一方面就是企业员工输入以及一些智能化工具比如软件机器人收集到的数据,这类主要包含业务数据、商务数据等,但无论是生产数据还......
  • 剑指 Offer 67. 把字符串转换成整数
    题目描述:写一个函数StrToInt,实现把字符串转换成整数这个功能。不能使用atoi或者其他类似的库函数。 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合......
  • 13. 罗马数字转整数
    class Solution {        Map<Character, Integer> maps = new HashMap<>(){{        put('I', 1);        put('V', 5);        put('X', 10);        put('L', 50);        put('C', 100);       ......
  • 12. 整数转罗马数字
      贪心策略:classSolution{int[]values={1000,900,500,400,100,90,50,40,10,9,5,4,1};String[]symbols={"M","CM","D","CD","C","XC","L","XL","X","IX&q......