Leetcode167. 两数之和 II - 输入有序数组

【中等】力扣算法题解析LeetCode167:两数之和 II-输入有序数组 题目要求在非递减排序数组中找到两数之和等于目标值,并返回其下标(从1开始)。利用双指针技巧,初始化左指针在数组头部,右指针在尾部,通过比较当前和与目标值的差异动态移动指针:若和小则右移左指针,和大则左移右指针。时间复杂度O(n),空间复杂度O(1)。示例:输入[2,7,11,15]和9,输出[1,2]。 阅读详情

Every day a leetcode

题目来源:167. 两数之和 II - 输入有序数组

解法1:双指针法

初始时两个指针,左指针left指向数组的第一个元素,右指针right指向数组的最后一个元素。

每次计算两个指针指向的两个元素之和,并和目标值比较:

  • 如果两个元素之和等于目标值,则发现了唯一解;
  • 如果两个元素之和小于目标值,则将左侧指针右移一位;
  • 如果两个元素之和大于目标值,则将右侧指针左移一位。

移动指针之后,重复上述操作,直到找到答案。

代码:

C版本:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* twoSum(int* numbers, int numbersSize, int target, int* returnSize){
    *returnSize=2;
    int *ans;
    ans=(int*)malloc(2*sizeof(int));
    memset(ans,-1,sizeof(int));

    int left=0;
    int right=numbersSize-1;
    while(left<right)
    {
        if(numbers[left]+numbers[right]>target) right--;
        else if(numbers[left]+numbers[right]<target) left++;
        else
        {
            ans[0]=left+1;
            ans[1]=right+1;
            return ans;
        }
    }
    return ans;
}

C++版本(2023.6.5更新):

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

结果:

在这里插入图片描述

解法2:二分查找

在数组中找到两个数,使得它们的和等于目标值。

由于数组的有序性,先固定一个数,再在这个数的右边用二分查找寻找符合条件的另一个数。

代码:

C版本:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* twoSum(int* numbers, int numbersSize, int target, int* returnSize){
    *returnSize=2;
    int *ans;
    ans=(int*)malloc(2*sizeof(int));
    memset(ans,-1,sizeof(ans));

    for(int i=0;i<numbersSize;i++)
    {
        int left=i+1;
        int right=numbersSize-1;
        while(left<=right)
        {
            int mid=(left+right)/2;
            if(numbers[i]+numbers[mid]>target) right=mid-1;
            else if(numbers[i]+numbers[mid]<target) left=mid+1;
            else
            {
                ans[0]=i+1;
                ans[1]=mid+1;
                return ans;
            }
        }
    }
    //ans[0]=ans[1]=-1;
    return ans;
}

C++版本(2023.6.5更新):

class Solution
{
public:
    vector<int> twoSum(vector<int> &numbers, int target)
    {
        int n = numbers.size();
        vector<int> ans(2, 0);
        for (int i = 0; i < n; i++)
        {
            int left = i + 1, right = n - 1;
            while (left <= right)
            {
                int mid = (left + right) / 2;
                if (numbers[i] + numbers[mid] > target)
                    right = mid - 1;
                else if (numbers[i] + numbers[mid] < target)
                    left = mid + 1;
                else
                {
                    ans[0] = i + 1;
                    ans[1] = mid + 1;
                    return ans;
                }
            }
        }
        return ans;
    }
};

结果:

在这里插入图片描述

ParaView: 从 2 或 3 个标量创建向量 阅读详情

相关推荐

centos7搭建LNMP环境-编译安装&yum安装-超详细

文章目录1. 首先了解编译安装和yum安装的区别。2. yum安装准备工作---切换阿里云yum源3. 编译安装lnmp4.yum安装lnmp5. lnmp一键安装6. 一些报错7. 笔记8. 参考文章 1. 首先了解编译安装和yum安装的区别。 windows下安装centos虚拟机,之前写过。传送门~~ 编译安装: 可以按需安装,想安在哪个目录下就安在哪个目录下。 可以设定参数 可安装自己想要的版本 yum安装: 安装的方便快捷 不需要考虑包的依赖 可以直接使用service nginx st

最美不过下雨天 9349

C/C++描述 LeetCode 167. 两数之和 II - 输入有序数组

C/C++描述 LeetCode 167. 两数之和 II - 输入有序数组   大家好,我叫亓官劼(qí guān jié ),在优快云中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在优快云中写博客,唯一博客更新的地址为:亓官劼的博客 本文原创为亓官劼,请大家支持原创,部分平台一直在恶意盗取博主的文章!!! 题目 给定一个已按照*升序排列* 的有序数组,找到两个数使得它们相加之和等于目标数。 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于

一起加油 2055

MMWCAS-DSP-EVM与AWR2243实战:从开箱到数据采集的完整避坑指南

本文提供了MMWCAS-DSP-EVM与AWR2243毫米波雷达评估板从开箱、软硬件准备、固件烧录到数据采集的完整实战指南。重点解析了硬件连接、软件版本匹配、固件烧录、网络配置及MMWave Studio GUI操作等关键步骤,并汇总了常见问题排查方法,帮助开发者快速上手并规避常见陷阱。

algae的博客 504

167. 两数之和 II - 输入有序数组【 力扣(LeetCode) 】

给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1

yyh520025的博客 662

python 识别滑块验证码

博客来源于: https://www.cnblogs.com/wyh0923/p/16528354.html # -*- coding: utf-8 -*- # https://gov.pkulaw.cn/ 1. import io 2. import json 3. from pathlib import Path 4. from PIL import Image 5. import bas...

2103

Springboot(五十六)SpringBoot3集成SkyWalking

Dskywalking.collector.backend_service:表示skywalking的collector服务的IP及端口。注意上图中红框标注的位置,我们可以根据启动Springboot项目启动时候控制台输出的ID进行筛选。注意上图中红框标注的位置,我们可以根据启动Springboot项目启动时候控制台输出的ID进行筛选。其他的版本的 APM 地址(这个我不需要,我们是在docker中部署的,留给有需要的同学)其他的java 版本的 Agents 地址。

camellia的博客 2601

167. 两数之和 II - 输入有序数组 - 力扣(LeetCode)

题目描述 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。 说明: 返回的下标值(index1 和 index2)不是从零开始的。 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。 示例: 输入: numbers = [2, 7, 11, 15], ...

Onwaier的博客 407

Odoo 集成ReportBro报表设计器支持13,14,15,16,17,18,19

Odoo 集成ReportBro零代码报表设计器,ReportBro设计器 一个用于创建PDF和XLSX报告模板的javascript插件。

zxltwins的博客 3379

力扣解题-167. 两数之和 II - 输入有序数组

暴力双指针法(第一次解答):未利用有序特性,O(n²)时间复杂度导致超时,仅适合理解基础思路;首尾双指针法(第二次解答):最优解,O(n)时间+O(1)空间,完全贴合题目要求,是面试/工程首选;二分查找法(备选解):O(n×logn)时间+O(1)空间,效率略低但逻辑通用,适合拓展学习;关键技巧:有序数组的两数之和问题,优先使用首尾双指针法,利用“左小右大”特性精准调整和的大小;避免暴力遍历,充分利用题目给出的“有序”“唯一解”等关键条件;

qq_38261626的博客 922

STM32芯片解锁读写保护:更改Option Byte [Error已解决]

解锁读保护:STLink更改Option Byte 变Level从1变为0,点击Apply即可。(程序执行读保护,其实是将Level从0变为1) 默认情况下该保护功能是不开启的,若要开启该功能,需要改写内部FLASH选项字节(Option Bytes)中的配置。 RDP读保护级别 级别0,无保护, 级别1,使能读保护, 这种保护下,若使用调试功能(使用下载器、仿真器)或者从内部SRAM自举时都不能对内部FLASH及备份SRAM作任何访问(读写、擦除都被禁止); 当芯片处于级别1的时候,可以把选项字节

HowieXue 薛永浩的博客 2万+

【100%通过率】华为机试真题 Python 实现【对称美学】【2022.11 Q4 新题】

对称就是最大的美学,现有一道关于对称字符串的美学。 已知: 第1个字符串:R 第2个字符串:BR 第3个字符串:RBBR 第4个字符串:BRRBRBBR 第5个字符串:RBBRBRRBBRRBRBBR相信你已经发现规律了,没错! 就是第i个字符串=第i-1号字符串的取反+第i-1号字符串。取反即(R->B,B->R); 现在告诉你n和k,让你求得第n个字符串的第k个字符是多少。(k的编号从0开始)

MISAYAONE的博客 1万+

力扣leetcode之Java刷题167两数之和 II - 输入有序数组

leetcode之Java刷题

小李子Lee 251

2026实测可用!4个专业AI Agent Skills垂直搜索平台对比

📊本文以表格形式整理4个实测可用的专业AI Agent Skills垂直搜索平台,涵盖资源规模、适配生态等关键维度🤖,适合开发者按需选择技能获取渠道,解决平台筛选与访问难题✨

XiaoqiangClub的博客 525

leetcode 两数相加c++_167. 两数之和 II - 输入有序数组

167. 两数之和 II - 输入有序数组给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1和 index2,其中 index1必须小于 index2。说明:返回的下标值(index1和 index2)不是从零开始的。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。示例1 :输入: numbers = [2, 7, ...

weixin_39904809的博客 185

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

力扣 #167.两数之和 II - 输入有序数组 JAVA实现

力扣 #167.两数之和 II - 输入有序数组 JAVA实现

weixin_54525144的博客 377

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

力扣leetcode 167. 两数之和 II - 输入有序数组 java

class Solution { public int[] twoSum(int[] numbers, int target) { for(int i=0; i<numbers.length-1; i++) for(int j=i+1; j<numbers.length; j++) if(numbers[...

izhxxx的博客 304

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java实现 LeetCode 167 两数之和 II - 输入有序数组

167. 两数之和 II - 输入有序数组 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。 说明: 返回的下标值(index1 和 index2)不是从零开始的。 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。 示例: 输入: numbers =...

南 墙 1万+

力扣第167题 两数之和 II- 输入有序数组 哈希表 c++ 新手推荐

注意,循环条件应为i < numbers.size(),而不是i <= numbers.size(),因为数组索引是从0开始的。在遍历数组numbers的过程中,对于每个元素numbers[i],我们通过哈希表查找是否存在另一个数target - numbers[i]。>对于空间复杂度来说,这段代码使用了一个哈希表来存储数组元素及其索引,所以空间复杂度为O(n),其中n是数组的长度。C++语言的代码,用于在给定的整数数组numbers中找到两个数,使其和等于给定的目标值target。重复使用相同的元素。

lenyan~的博客 376

#力扣 LeetCode167. 两数之和 II - 输入有序数组 @FDDLC

题目描述: https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted/ Java代码: import java.util.HashMap; //已按照升序排列 class Solution { //返回的下标值(index1 和 index2)不是从零开始的;ndex1 必须小于 index2 public int[] twoSum(int[] numbers, int target) { //每个输入只对应唯一.

LiuXingchang的博客 335

【力扣(LeetCode)】【C/C++】【167.两数之和 II - 输入有序数组】

力扣算法刷题

繁华倾夏的博客 326

leetcode 167.两数之和 II - 输入有序数组

leetcode 167.两数之和 II - 输入有序数组 题目描述 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。 说明: 返回的下标值(index1 和 index2)不是从零开始的。 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。 示例...

EngineerHe的博客 1622

怎么根据输入的n来输入n组数组_LeetCode 题解 | 167.两数之和 II - 输入有序数组...

力扣 167. 两数之和 II - 输入有序数组(点击查看题目)题目描述给定一个已按照 升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。说明:返回的下标值(index1 和 index2)不是从零开始的。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。示例:解决方案...

weixin_39562327的博客 293

167. 两数之和 II - 输入有序数组 leetcode

167. 两数之和 II - 输入有序数组 - 力扣(LeetCode)

ranzhiyimu的博客 200

LeetCode-167. 两数之和 II - 输入有序数组

因此 index1 = 1, index2 = 2。因为数组已经排好序,我们可以采用方向相反的双指针来寻找这两个数字,一个初始指向最。如果两个指针指向元素的和等于给定值,那么它们就是我们要的结果。小的元素,即数组最左边,向右遍历;一个初始指向最大的元素,即数组最右边,向左遍历。对于排好序且有解的数组,双指针一定能遍历到最优解。此时两个指针指向值的和小于给定值,因此左指针会一直右移直到到达。此时两个指针指向值的和大于给定值,因此右指针会一直左移直到到达。好序且有解的数组,双指针一定能遍历到最优解。

m0_75107602的博客 305

力扣刷题167. 两数之和 II - 输入有序数组

双指针,首先定义两个指针左指针l和右指针r,分别指向最左边和最右边,先求两个指针指向的数之和,因为数组已经按照非递减排序了,如果该和大于目标数,那么就让最右边的指针减一,否则让最左边的指针加一,直至找到目标数即可。

2403_83306207的博客 264

LeetCode 167. 两数之和 II - 输入有序数组(Java)

167. 两数之和 II - 输入有序数组 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。 说明: 返回的下标值(index1 和 index2)不是从零开始的。 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。 示例: 输入: numbers =...

nuts_and_bolts的博客 207
上一篇: Leetcode283. 移动零
下一篇: Leetcode344. 反转字符串
UestcXiye
博客等级 码龄8年 9031粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值