【力扣刷题实战】查找总价格为目标值的两个商品
大家好,我是小卡皮巴拉
文章目录
目录
力扣题目: 查找总价格为目标值的两个商品
题目描述
解题思路
问题理解
算法选择
具体思路
解题要点
完整代码(C++)
兄弟们共勉 !!!
每篇前言
博客主页:小卡皮巴拉
咱的口号:🌹小比特,大梦想🌹
作者请求:由于博主水平有限,难免会有错误和不准之处,我也非常渴望知道这些错误,恳请大佬们批评斧正。
力扣题目: 查找总价格为目标值的两个商品
原题链接:LCR 179. 查找总价格为目标值的两个商品 - 力扣(LeetCode)
题目描述
购物车内的商品价格按照升序记录于数组 price
。请在购物车中找到两个商品的价格总和刚好是 target
。若存在多种情况,返回任一结果即可。
示例 1:
输入:price = [3, 9, 12, 15], target = 18 输出:[3,15] 或者 [15,3]
示例 2:
输入:price = [8, 21, 27, 34, 52, 66], target = 61 输出:[27,34] 或者 [34,27]
解题思路
问题理解
题目给定一个升序排列的商品价格数组 price
,要求在数组中找到两个元素,使得它们的和恰好等于目标值 target
。如果存在多组满足条件的元素,只需返回其中任意一组结果。
算法选择
采用双指针算法。由于数组已经是升序排列,使用双指针分别从数组的两端开始遍历,通过调整指针的位置来寻找满足条件的两个元素,这样可以在较低的时间复杂度内解决问题,避免了暴力枚举所有元素对的高时间复杂度。
具体思路
-
初始化双指针:定义左指针
left
指向数组的起始位置(即0
),右指针right
指向数组的末尾位置(即price.size() - 1
)。 -
循环遍历:在
left < right
的条件下进行循环:-
计算当前左指针和右指针所指元素的和
price[left] + price[right]
。 -
如果和小于目标值
target
,说明当前的两个元素之和过小,将左指针left
右移一位,增大和的值,继续寻找。 -
如果和大于目标值
target
,说明当前的两个元素之和过大,将右指针right
左移一位,减小和的值,继续寻找。 -
如果和等于目标值
target
,则找到了满足条件的两个元素,直接返回这两个元素组成的向量。
-
-
返回结果:如果循环结束后仍未找到满足条件的两个元素,即
left >= right
时,返回一个空向量,表示没有找到符合条件的元素对。
解题要点
-
数组有序:数组必须是升序排列的,这是使用双指针算法的前提条件,只有在有序数组中,才能根据指针所指元素之和与目标值的大小关系来合理移动指针。
-
指针移动策略:根据当前两个指针所指元素之和与目标值的大小关系,准确地移动左指针或右指针。和小于目标值时左指针右移,和大于目标值时右指针左移。
-
循环结束条件:循环的结束条件是
left < right
,当left >= right
时,说明已经遍历完所有可能的元素对,若还未找到满足条件的结果,则不存在这样的两个元素。
完整代码(C++)
class Solution {
public:
vector<int> twoSum(vector<int>& price, int target)
{
int left = 0, right = price.size() - 1; // 初始化左右指针,分别指向数组首尾
while (left < right)
{
if (price[left] + price[right] < target)
left++; // 和小于目标值,左指针右移
else if (price[left] + price[right] > target)
right--; // 和大于目标值,右指针左移
else
return {price[left], price[right]}; // 和等于目标值,返回结果
}
return {}; // 未找到符合条件的元素,返回空向量
}
};
兄弟们共勉 !!!
码字不易,求个三连
抱拳了兄弟们!