LCR 179.查找总价值为目标值的两个商品
文章目录
- 一、读题
- 二、算法思路
- 三、代码实现:
一、读题
题目来源:https://leetcode.cn/problems/he-wei-sde-liang-ge-shu-zi-lcof/

题目很简单,找两个数相加得到另外一个数
二、算法思路
依旧啊,看到这样的题目第一个想法还是暴力,两个for循环全部遍历一遍,肯定能够找出来结果,但是也是不负众望超时了哈哈哈哈哈哈
因此我们需要考虑其他的算法了,我们可以依据暴力找解题的思路,依旧啊,暴力的本质是通过遍历一个数据一个数据的排除,先拿一个数和剩下的数进行相加,成立就返回,不成立就继续加,那么我们也可以按照这个思路,看看是否可以降低时间复杂度
我们可以先排序,这道题目对于返回的数据没有顺序要求,那么我们就可以先排序看看有没有思路。
排序后我们想一想,两个数相加,会得到一个数,那么这个数要么大于要么小于要么等于对吧,当我们得到target的时候,如果小于target的时候我们会增大两个数,如果大于target我们会减小两个数,如果等于就什么都不做。那么在这一道题目当中我们可以直接拿最大的数和最小的数相加,拿到的结果如果大于target,那么移动最大的数减小,如果小于target,那么就移动最小的数增大,如果等于就直接返回,最极端的情况下就是根本找不到,但是看题目的意思,并没有说存在无法找到的情况,因此按照我们的思路就绝对可以找到结果。
本质上还是根据数据的单调性来找答案,既然答案肯定能够在数组当中找出来,那么直接找一个中间值,那么这个中间值就是最大的数加最小的数,如果这个中间值小了就增大最小值,如果中间值大了就减小最大值,这个思路其实就是二分但不是纯二分,在这一道题我们是使用双指针的算法来解决问题,借鉴二分来找解题思路。

三、代码实现:
class Solution {//暴力没有过全部案例public int[] twoSum(int[] price, int target) {int[] ans = new int[2];for(int i = 0 ; i < price.length - 1 ; ++i) {for(int j = i + 1 ; j < price.length ; ++j) {if((price[i] + price[j]) == target) {ans[0] = price[i];ans[1] = price[j];return ans;}}}return ans;}public int[] twoSum(int[] price, int target) {Arrays.sort(price);int[] ans = new int[2];int n = price.length;int i = 0;int j = n - 1;while(i < j) {if(price[i] + price[j] > target) {j--;} else if(price[i] + price[j] < target){i++;} else {ans[0] = price[i];ans[1] = price[j];break;}}return ans;}
}
各位佬,如果有什么更加高效的算法欢迎评论区讨论,指导一下主包进步,大家一起共勉
