167. 两数之和 II - 输入有序数组(暴力+二分查找+相向双指针)

news/2025/1/11 18:46:20/

目录

前言

一、 暴力求解

二、 二分查找

三、相向双指针



前言

题目描述

给你一个下标从 1 开始的整数数组 numbers,该数组已按非递减顺序排列(即从小到大排列,中间可以有数字重复),请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2],则 1 <= index1 < index2 <= numbers.length。

以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。

你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。

你所设计的解决方案必须只使用常量级的额外空间。

示例 1

输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。

示例 2

输入:numbers = [2,3,4], target = 6
输出:[1,3]
解释:2 与 4 之和等于目标数 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3] 。

示例 3

输入:numbers = [-1,0], target = -1
输出:[1,2]
解释:-1 与 0 之和等于目标数 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。

提示

  • 2 <= numbers.length <= 3 * 10^4

  • -1000 <= numbers[i] <= 1000

  • numbers非递减顺序 排列

  • -1000 <= target <= 1000

  • 仅存在一个有效答案

一、 暴力求解

/*** Note: The returned array must be malloced, assume caller calls free().*/int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) 
{*returnSize = 2;int* returnArray = (int*)malloc(sizeof(int) * 2);int i = 0;int j = 0;for (i = 0; i < numbersSize - 1; i++){for (j = i + 1; j < numbersSize; j++){if (numbers[i] + numbers[j] == target){returnArray[0] = i + 1;returnArray[1] = j + 1;goto end;  // 跳出两层 for 循环}}}
end:return returnArray;
}

注意:虽然在题目描述中整数数组 numbers 的下标是从 1 开始的,但是实际上数组的下标是从 0 开始的,所以当从数组中找到满足相加之和等于目标数 target 的两个数时,要把这两个数对应的数组下标加 1

二、 二分查找

暴力解法中并没有利用到数组已按非递减顺序排列这一已知条件。

/*** Note: The returned array must be malloced, assume caller calls free().*/int* twoSum(int* numbers, int numbersSize, int target, int* returnSize)
{*returnSize = 2;int* returnArray = (int*)malloc(sizeof(int) * 2);int i = 0;for (i = 0; i < numbersSize - 1; i++){int left = i + 1;int right = numbersSize - 1;while (left <= right){int mid = (left + right) / 2;int sum = numbers[i] + numbers[mid];if (sum > target){right = mid - 1;}else if (sum < target){left = mid + 1;}else{returnArray[0] = i + 1;returnArray[1] = mid + 1;goto end;  // 跳出 while 循环和 for 循环}}}
end:return returnArray;
}

三、相向双指针

/*** Note: The returned array must be malloced, assume caller calls free().*/int* twoSum(int* numbers, int numbersSize, int target, int* returnSize)
{*returnSize = 2;int* returnArray = (int*)malloc(sizeof(int) * 2);int left = 0;int right = numbersSize - 1;while (left < right){int sum = numbers[left] + numbers[right];if (sum > target){right--;}else if (sum < target){left++;}else{returnArray[0] = left + 1;returnArray[1] = right + 1;break;  // 跳出 while 循环}}return returnArray;
}

示例

输入:numbers = [2,3,4,6,8],target = 9
输出:[2,4]

分析

  1. numbers[0] + numbers[4] = 2 + 8 = 10 > target,由于数组已按非递减顺序排列,所以 numbers[4] 和数组中其他任意数字的和都大于 target,因此删除这种可能,即让 right--。

  2. numbers[0] + numbers[3] = 2 + 6 = 8 < target,由于数组已按非递减顺序排列,所以numbers[0] 和数组中其他任意数字的和都小于 target,因此删除这种可能,即让 left++。

  3. numbers[1] + numbers[3] = 3 + 6 = 9 = target。


http://www.ppmy.cn/news/7243.html

相关文章

易基因|动物发育过程中顺式调控区域的活性DNA去甲基化早于脊椎动物起源:重磅研究

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 2022年12月02日&#xff0c;澳大利亚悉尼加尔文医学研究所基因组学和表观遗传学系Ozren Bogdanovic研究团队在《SCIENCE ADVANCES》杂志发表了题为“Active DNA demethylation of develo…

【OpenCV-Python】教程:9-1 级联分类器训练

OpenCV Python 级联分类器训练 【介绍】 使用增强的弱分类器级联包括两个主要阶段: 训练和检测阶段。使用基于HAAR或LBP模型的检测,在object detection tutorial中进行了描述。本文档概述了训练您自己的增强弱分类器级联所需的功能。当前的手册将走过所有不同的阶段: 收集训练…

全志 芯片 Linux MIPI CSI摄像头接口开发指南 VIN DVP CSI MIPI V4l2

1 前言 1.1 文档简介 介绍 VIN&#xff08;video input&#xff09;驱动配置&#xff0c;API 接口和上层使用方法。 1.2 目标读者 camera 驱动开发、维护人员和应用开发人员。 1.3 适用范围 ​ 表 1-1: 适用产品列表 内核版本驱动文件Linux-4.9drivers/media/platform/s…

Himall商城文件操作接口Commons

/// <summary> /// 删除文件 /// </summary> /// <param name="fileName">文件名称</param> void DeleteFile(string fileName); /// <summary> /// 删除多个文件 /// </summary&…

FFT求多项式乘积

文章目录引入单位根快速傅里叶变换的数学证明IFFT朴素版FFT函数代码优化FFT参考资料引入 之前在b站上看到了一些介绍FFT的视频 《快速傅里叶变换(FFT)——有史以来最巧妙的算法&#xff1f;》 《这个算法改变了世界》 于是打算写一篇记录一下qwq&#xff08;本博客中的截图基…

【Macbook】精选的MAC电脑软件推荐

1、终端软件&#xff1a;iTerm 下载地址&#xff1a;iTerm2 - macOS Terminal Replacement iTerm2 是一款功能强大的终端工具&#xff0c;也可以说是 Terminal 的替代品&#xff0c;也可以说是 iTerm 的后继产品。它适用于 macOS 10.12 或更高版本的 macOS。 它支持分窗口操作…

菜鸟也能懂的 - 音视频基础知识。

前言 说到视频&#xff0c;大家自己脑子里基本都会想起电影、电视剧、在线视频等等&#xff0c;也会想起一些视频格式 AVI、MP4、RMVB、MKV等等。 但是我们如果认真思考这些应该就有很多疑问&#xff0c;比如以下问题&#xff1a; mp4 和 mkv有什么区别 &#xff1f; 视频封装…

手绘图说电子元器件-电声转换器件

电声转换器件包括能够将电信号转换为声音的扬声器、耳机、讯响器和蜂鸣器,能够将声音转换为电信号的传声器,能够进行电磁转换的磁头和具有压电效应的晶体等。 扬声器 扬声器俗称喇叭,是一种常用的电声转换器件,其基本作用是将电信号转换为声音,在收音机、录音机、电视机…