【优选算法】——Leetcode——LCR 179. 查找总价格为目标值的两个商品

1.题目

2. 解法⼀(暴⼒解法,会超时):

1.算法思路:

2.图解 

3. 代码实现

 3. 解法⼆(双指针-对撞指针):

1.算法思路:

 2.图解

3.代码实现             

 1.C语言   

2.C++                      


1.题目

LCR 179. 查找总价格为目标值的两个商品

购物车内的商品价格按照升序记录于数组 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]

提示:

  • 1 <= price.length <= 10^5
  • 1 <= price[i] <= 10^6
  • 1 <= target <= 2*

2. 解法⼀(暴⼒解法,会超时):


1.算法思路:

两层 for 循环列出所有两个数字的组合,判断是否等于⽬标值。
算法流程:
两层 for 循环:
◦ 外层 for 循环依次枚举第⼀个数 a ;
◦ 内层 for 循环依次枚举第⼆个数 b ,让它与 a 匹配;
ps :这⾥有个魔⻤细节:我们挑选第⼆个数的时候,可以不从第⼀个数开始选,因为 a 前
⾯的数我们都已经在之前考虑过了;因此,我们可以从 a 往后的数开始列举。
◦ 然后将挑选的两个数相加,判断是否符合⽬标值。

2.图解 

3. 代码实现

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {int n = nums.size();for (int i = 0; i < n; i++) { // 第⼀层循环从前往后列举第⼀个数for (int j = i + 1; j < n;j++) { // 第⼆层循环从 i 位置之后列举第⼆个数 if (nums[i] + nums[j] ==target) // 两个数的和等于⽬标值,说明我们//已经找到结果了return {nums[i], nums[j]};}}return {-1, -1};}
};

 3. 解法⼆(双指针-对撞指针):

1.算法思路:


注意到本题是升序的数组,因此可以⽤「对撞指针」优化时间复杂度。
算法流程(附带算法分析,为什么可以使⽤对撞指针):
a. 初始化left , right 分别指向数组的左右两端(这⾥不是我们理解的指针,⽽是数组的下标)
b. 当 left < right 的时候,⼀直循环


i. 当 nums[left] + nums[right] == target 时,说明找到结果,记录结果,并且返回;


ii. 当 nums[left] + nums[right] < target 时:
• 对于 nums[left] ⽽⾔,此时 nums[right] 相当于是nums[left] 能碰到的最⼤值(别忘了,这⾥是升序数组哈~)。如果此时不符合要求,说明在这个数组⾥⾯,没有别的数符合 nums[left] 的要求了(最⼤的数都满⾜不了你,你已经没救了)。因此,我们可以⼤胆舍去这个数,让 left++ ,去⽐较下⼀组数据;
• 那对于 nums[right] ⽽⾔,由于此时两数之和是⼩于⽬标值的, nums[right] 还可以选择⽐nums[left] ⼤的值继续努⼒达到⽬标值,因此 right 指针我们按兵不动;

  iii. 当 nums[left] + nums[right] > target 时,

同理我们可以舍去nums[right] (最⼩的数都满⾜不了你,你也没救了)。让 right-- ,继续⽐较下⼀组数据,⽽ left 指针不变(因为他还是可以去匹配⽐ nums[right] 更⼩的数的)。

 2.图解

                                                                                                                                                                            

                                                                                                     

 3.代码实现 

此时我们需要     

 // 照顾编译器return {-4941, -1};

              

 1.C语言   

时间复杂度为O(n),空间复杂度为O(1)

int* twoSum(int* price, int priceSize, int target, int* returnSize){int left = 0;int right = priceSize - 1;*returnSize = 2;int *ret = (int*)malloc(*returnSize * sizeof(int));while (left < right){int sum=price[left] + price[right];if ( sum == target) {ret[0] = price[left];ret[1] = price[right];return ret;} else if ( sum > target) {right--;} else {left++;}}return NULL;
}

2.C++     

class Solution {
public:vector<int> twoSum(vector<int>& price, int target){
int left = 0, right = price.size() - 1;while (left < right) {int sum = price[left] + price[right];if (sum > target)right--;else if (sum < target)left++;elsereturn {price[left], price[right]};}// 照顾编译器return {-4941, -1};}
};

                               

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/681215.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vuex 和 Pinia 两个状态管理模式的区别

Pinia和Vuex一样都是是vue的全局状态管理器。其实Pinia就是Vuex5&#xff0c;只不过为了尊重原作者的贡献就沿用了这个看起来很甜的名字Pinia。&#xff08;实际项目中千万不要即用Vuex又用Pinia&#xff0c;不然你会被同事‘’请去喝茶的‘’。 一、安装&#xff08;常用命令安…

mysql其它补充

exist和in的区别 exists 用于对外表记录做筛选。 exists 会遍历外表&#xff0c;将外查询表的每一行&#xff0c;代入内查询进行判断。 当 exists 里的条件语句能够返回记录行时&#xff0c;条件就为真&#xff0c;返回外表当前记录。反之如果 exists 里的条件语句不能返回记…

【数据结构与算法】力扣 226. 翻转二叉树

题目描述 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a; root [4,2,7,1,3,6,9] 输出&#xff1a; [4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a; root [2,1,3] 输出&#xff1a; [2,3,1…

【C++】Visual Studio 2019 给 C++ 文件添加头部注释说明

使用代码片段管理器&#xff0c;添加快捷插入代码文件说明 1. 效果 2. header.snippet 新建 header.snippet 文件&#xff0c;存放到某个文件夹 内容&#xff0c;自行更新 快捷名称&#xff0c;修改 Header 里面内容注释内容&#xff0c;修改 Code 里面内容 <?xml ver…

每日一题 第九十七期 洛谷 [NOIP2000 提高组] 方格取数

[NOIP2000 提高组] 方格取数 题目背景 NOIP 2000 提高组 T4 题目描述 设有 N N N \times N NN 的方格图 ( N ≤ 9 ) (N \le 9) (N≤9)&#xff0c;我们将其中的某些方格中填入正整数&#xff0c;而其他的方格中则放入数字 0 0 0。如下图所示&#xff08;见样例&#xf…

umi6.x + react + antd的项目增加403(无权限页面拦截),404,错误处理页面

首先在src/pages下创建403&#xff0c;404&#xff0c;ErrorBoundary 403 import { Button, Result } from antd; import { history } from umijs/max;const UnAccessible () > (<Resultstatus"403"title"403"subTitle"抱歉&#xff0c;您无权…

C++ | Leetcode C++题解之第70题爬楼梯

题目&#xff1a; 题解&#xff1a; class Solution { public:int climbStairs(int n) {double sqrt5 sqrt(5);double fibn pow((1 sqrt5) / 2, n 1) - pow((1 - sqrt5) / 2, n 1);return (int)round(fibn / sqrt5);} };

跨越智能建筑桥梁:西门子PLC无缝对接BACnet楼宇自动化系统化

智能楼宇每一个环节的互联互通都至关重要&#xff0c;而PLC&#xff08;可编程逻辑控制器&#xff09;作为自动化领域的基石&#xff0c;其与BACnet协议的融合无疑成为了构建智能楼宇神经系统的关键节点。今天&#xff0c;让我们深入探讨如何利用先进的PLC转BACnet协议网关&…

springAI框架学习总结

springAI 1.springAI基本介绍 springAI是一个AI工程应用框架&#xff0c;其目标是将 Spring 生态系统设计原则&#xff08;例如可移植性和模块化设计&#xff09;应用于 AI 领域&#xff0c;并推广使用 POJO 作为 AI 领域应用程序的构建块。 2.特性 灵活的AIP支持chat,text…

刀片电池创新技术引领的能源革命速锐得揭秘比亚迪海豹核心数据

在全球汽车工业迈向电动化浪潮的今天&#xff0c;电池技术作为电动汽车发展的核心&#xff0c;其重要性不言而喻。比亚迪&#xff0c;作为中国领先的新能源汽车制造商&#xff0c;近年来推出了具有颠覆性创新的刀片电池&#xff0c;引起了新能源汽车业界的广泛关注。速锐得对比…

终于有人把HTTP、HTTPS、SOCKS5三种代理协议讲清楚了!

IP代理可以用于很多场景&#xff0c;无论是家庭网络还是工作网络&#xff0c;都为我们的日常工作提供了很多便利。HTTP、HTTPS 和 SOCKS5都是代理&#xff08;Proxy&#xff09;协议&#xff0c;用于在网络通信中转发请求和响应&#xff0c;但它们在工作原理和用途上有着不同的…

一、手写一个uart协议——rs232

先了解一下关于uart和rs232的基础知识 文章目录 一、RS232的回环测试1.1模块整体架构1.2 rx模块设计1.2.1 波形设计1.2.2代码实现与tb1.2.4 仿真 1.3 tx模块设计1.3.1 波形设计1.3.2 代码实现与tb1.3.4 顶层设计1.3.3 仿真 本篇内容&#xff1a; 一、RS232的回环测试 上位机…