📚 目录
-
[1. 题目解析](#1. 题目解析)
-
[2. 算法原理](#2. 算法原理)
-
[3. 编写代码](#3. 编写代码)
LCR 179. 查找总价格为目标值的两个商品(有序数组双指针两数之和)
1. 题目解析

- 数组内两个商品下标不能相同(两个数是不同元素);
- 题目保证一定存在唯一一组 / 多组合法解,不需要处理无解边界;
本题数组天然升序,因此可以用空间 O (1) 的双指针,这也是我们后续三数之和解法的基础工具。
[🔙 返回目录](#🔙 返回目录)
2. 算法原理
讲算法原理之前,我们先来了解一下暴力解法.
暴力解法也很简单 : 进行两重循环,进行遍历数组,将每一种情况都枚举出来,判断两数之和是否等于target;
| 解法 | 时间复杂度 | 空间复杂度 | 说明 |
|---|---|---|---|
| 暴力两层循环 | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) | 两层嵌套遍历所有数对,仅常数临时变量,无额外容器 |
双指针算法

解题核心:依托数组升序的特性,设置左右双指针,根据两数之和与target的大小动态收缩指针
- 左指针left初始在数组头部(最小值),右指针right初始在数组尾部(最大值)
nums[left] + nums[right] > target:数值总和偏大,右指针向前移动缩小总和;nums[left] + nums[right] < target:数值总和偏小,左指针向后移动增大总和;- 两数之和等于target时,直接输出这两个数字,满足题目任意一组解即可;
| 解法 | 时间复杂度 | 空间复杂度 | 说明 |
|---|---|---|---|
| 暴力两层循环 | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) | 两层嵌套遍历所有数对,仅常数临时变量,无额外容器 |
| 有序双指针 | O ( n ) O(n) O(n) | O ( 1 ) O(1) O(1) | 仅单次遍历数组,只使用两个指针变量,最优解法 |
[🔙 返回目录](#🔙 返回目录)
3. 编写代码
java
class Solution {
public int[] twoSum(int[] price, int target) {
//定义左右指针
int left = 0;
int right = price.length-1;
while(left<right) {
//与目标值进行判断
if(price[left]+price[right] < target) {
left++;
}else if (price[left]+price[right] > target) {
right--;
}else {
//返回等于目标值的数组
return new int[]{price[left],price[right]};
}
}
return new int[]{price[left],price[right]};
}
}

Java双指针算法精讲:三数之和
[🔙 返回目录](#🔙 返回目录)