当前位置: 首页 > news >正文

LeetCode 923.多重三数之和

给定一个整数数组 arr ,以及一个整数 target 作为目标值,返回满足 i < j < k 且 arr[i] + arr[j] + arr[k] == target 的元组 i, j, k 的数量。

由于结果会非常大,请返回 109 + 7 的模。

示例 1:

输入:arr = [1,1,2,2,3,3,4,4,5,5], target = 8
输出:20
解释:
按值枚举(arr[i], arr[j], arr[k]):
(1, 2, 5) 出现 8 次;
(1, 3, 4) 出现 8 次;
(2, 2, 4) 出现 2 次;
(2, 3, 3) 出现 2 次。
示例 2:

输入:arr = [1,1,2,2,2,2], target = 5
输出:12
解释:
arr[i] = 1, arr[j] = arr[k] = 2 出现 12 次:
我们从 [1,1] 中选择一个 1,有 2 种情况,
从 [2,2,2,2] 中选出两个 2,有 6 种情况。

提示:

3 <= arr.length <= 3000
0 <= arr[i] <= 100
0 <= target <= 300

先对arr进行排序,然后固定一个数字,进行相向双指针计算即可:

class Solution {
public:int threeSumMulti(vector<int>& arr, int target) {long long ans = 0;sort(arr.begin(), arr.end());// 每次固定一个数字for (int i = 0; i < arr.size() - 2; ++i) {int left = i + 1;int right = arr.size() - 1;if (arr[i] + arr[i + 1] + arr[i + 2] > target) {break;}if (arr[i] + arr[right] + arr[right - 1] < target) {continue;}while (left < right) {if (arr[i] + arr[left] + arr[right] > target) {--right;} else if (arr[i] + arr[left] + arr[right] < target) {++left;} else {// 如果left和right指向的数字的值相同// 说明[left, right]中任意两数字加arr[i]的和都为targetif (arr[left] == arr[right]) {ans += (right - left + 1) * (right - left) / 2;break;}// 计算左指针指向的数字有多少个连续相同的int leftSame = 1;++left;while (arr[left] == arr[left - 1]) {++leftSame;++left;}// 计算右指针指向的数字有多少个相同的int rightSame = 1;--right;while (arr[right] == arr[right + 1]) {++rightSame;--right;}ans += leftSame * rightSame;}}}return ans % (int)(1e9 + 7);}
};

如果arr的长度为n,则此算法时间复杂度为O(n2^22),空间复杂度为O(logn)。

http://www.lryc.cn/news/601401.html

相关文章:

  • PMO如何赋能AI产品项目治理和价值交付︱商汤绝影PMO总监陈福龙
  • 0-1BFS(双端队列,洛谷P4667 [BalticOI 2011] Switch the Lamp On 电路维修 (Day1)题解)
  • 【C++】论如何封装红黑树模拟实现set和map
  • Java全栈面试实战:从JVM到AI的技术演进之路
  • JavaScript手录07-数组
  • LangChain实现RAG
  • JavaSE-String类
  • Rust赋能智能土木工程革新
  • 【奔跑吧!Linux 内核(第二版)】第5章:内核模块
  • 栈----4.每日温度
  • 2.qt调试日志输出
  • 多智能体系统设计:协作、竞争与涌现行为
  • Day4.AndroidAudio初始化
  • bash的特性-常用的通配符
  • bash的特性-命令和文件自动补全
  • C++ 多线程(一)
  • 第六章 JavaScript 互操(2).NET调用JS
  • ios UIAppearance 协议
  • 「iOS」————消息传递和消息转发
  • 携带参数的表单文件上传 axios, SpringBoot
  • 深度解读Go 变量指针
  • [每周一更]-(第152期):Go中的CAS(Compare-And-Swap)锁原理详解
  • iOS安全和逆向系列教程 第20篇:Objective-C运行时机制深度解析与Hook技术
  • 结合Golang语言说明对多线程编程以及 select/epoll等网络模型的使用
  • goland编写go语言导入自定义包出现: package xxx is not in GOROOT (/xxx/xxx) 的解决方案
  • 学习Python中Selenium模块的基本用法(1:简介)
  • Day06–哈希表–242. 有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和
  • 仓库管理系统-2-后端之基于继承基类的方式实现增删改查
  • 7.25 C/C++蓝桥杯 |排序算法【下】
  • macOS 安装 Homebrew