Java双指针算法精讲(五) | LCR 179 有序数组两数之和 剑指Offer详解

📚 目录

  • [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的大小动态收缩指针

  1. 左指针left初始在数组头部(最小值),右指针right初始在数组尾部(最大值)
  2. nums[left] + nums[right] > target数值总和偏大,右指针向前移动缩小总和;
  3. nums[left] + nums[right] < target数值总和偏小,左指针向后移动增大总和;
  4. 两数之和等于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双指针算法精讲:三数之和
[🔙 返回目录](#🔙 返回目录)