LeetCode 1755. 最接近目标值的子序列和(状态枚举 + 双指针)
文章目录
- 1. 题目
- 2. 解题
1. 题目
给你一个整数数组 nums 和一个目标值 goal 。
你需要从 nums 中选出一个子序列,使子序列元素总和最接近 goal 。
也就是说,如果子序列元素和为 sum ,你需要 最小化绝对差 abs(sum - goal)
。
返回 abs(sum - goal)
可能的 最小值 。
注意,数组的子序列是通过移除原始数组中的某些元素(可能全部或无)而形成的数组。
示例 1:
输入:nums = [5,-7,3,5], goal = 6
输出:0
解释:选择整个数组作为选出的子序列,元素和为 6 。
子序列和与目标值相等,所以绝对差为 0 。示例 2:
输入:nums = [7,-9,15,-2], goal = -5
输出:1
解释:选出子序列 [7,-9,-2] ,元素和为 -4 。
绝对差为 abs(-4 - (-5)) = abs(1) = 1 ,是可能的最小值。示例 3:
输入:nums = [1,2,3], goal = -7
输出:7提示:
1 <= nums.length <= 40
-10^7 <= nums[i] <= 10^7
-10^9 <= goal <= 10^9
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/closest-subsequence-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 直接枚举,时间复杂度 240≈10122^{40} \approx 10^{12}240≈1012,肯定超时
- 分治枚举,取出一半来枚举 220≈1062^{20} \approx 10^6220≈106,然后对两半边的状态排序,双指针求解
class Solution {public:int minAbsDifference(vector<int>& nums, int goal) {int n = nums.size();vector<int> arr1, arr2;getsum(nums, 0, n/2, arr1);getsum(nums, n/2, n, arr2);int i = 0, j = arr2.size()-1, n1 = arr1.size();int diff = INT_MAX, sum;while(i < n1 && j >= 0){sum = arr1[i] + arr2[j];diff = min(diff, abs(sum-goal));if(sum > goal)j--;else if(sum < goal)i++;elsebreak;}return diff;}void getsum(vector<int>& nums, int l, int r, vector<int>& arr){int n = r-l;arr.resize(1<<n);for(int i = 0; i < (1<<n); i++){for(int j = 0; j < n; j++){if(i & (1 << j))continue;// i 状态 包含 j 数字arr[i+(1<<j)] = arr[i] + nums[l+j];}}sort(arr.begin(), arr.end());}
};
1180 ms 29.2 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
LeetCode 1755. 最接近目标值的子序列和(状态枚举 + 双指针)相关推荐
- 3. Leetcode 16. 最接近的三数之和 (数组-双向双指针)
给你一个长度为 n 的整数数组 nums 和 一个目标值 target.请你从 nums 中选出三个整数,使它们的和与 target 最接近.返回这三个数的和.假定每组输入只存在恰好一个解.示例 1: ...
- LeetCode 2022春季赛 2. 烹饪料理(状态枚举)
文章目录 1. 题目 2. 解题 1. 题目 欢迎各位勇者来到力扣城,城内设有烹饪锅供勇者制作料理,为自己恢复状态. 勇者背包内共有编号为 0 ~ 4 的五种食材,其中 meterials[j] 表示 ...
- LeetCode 272. 最接近的二叉搜索树值 II(栈+优先队列)
文章目录 1. 题目 2. 解题 1. 题目 给定一个不为空的二叉搜索树和一个目标值 target,请在该二叉搜索树中找到最接近目标值 target 的 k 个值. 注意: 给定的目标值 target ...
- LeetCode 270. 最接近的二叉搜索树值
文章目录 1. 题目 2. 解题 2.1 暴力查找 2.2 二分查找 1. 题目 给定一个不为空的二叉搜索树和一个目标值 target,请在该二叉搜索树中找到最接近目标值 target 的数值. 注意 ...
- leetcode1300. 转变数组后最接近目标值的数组和
给你一个整数数组 arr 和一个目标值 target ,请你返回一个整数 value ,使得将数组中所有大于 value 的值变成 value 后,数组的和最接近 target (最接近表示两者之差的 ...
- Leetcode 32 最长合法括号子序列
算法特辑–动态规划 Leetcode 32 最长合法括号子序列 给定只有"(" 和 ")" 的字符串,求出最长的合法括号子序列. 例如:"())&qu ...
- 给定升序数组,以及目标值,查找出最接近目标值的所有数组组合
给定升序数组,以及目标值,查找出最接近目标值的所有数组组合 解题思路: 1.已知给定的数组是升序的,需要找出和目标值target相近的一些数字的组合,我们通过先找出大于等于的一部分,把这部分先过滤,这 ...
- 365天挑战LeetCode1000题——Day 038 公交站间的距离 + 基于时间的键值存储 + 转变数组后最接近目标值的数组和 + 有界数组中指定下标处的最大值
文章目录 1184. 公交站间的距离 代码实现(自解) 981. 基于时间的键值存储 代码实现(自解) 1300. 转变数组后最接近目标值的数组和 代码实现(自解) 1802. 有界数组中指定下标处的 ...
- LeetCode 659. 分割数组为连续子序列
LeetCode 659. 分割数组为连续子序列 回顾 根据题意,每个元素只会涉及两种情况: 已经存在nums[i]-1结尾的序列,我们把nums[i]接到之前的某个序列后. 尝试以nums[i]为头 ...
最新文章
- 模拟海_浙江平湖“海水稻”丰收的背后,有这家来自上海企业的科技“秘方”...
- H5新特性 input type=date 在手机上默认提示显示无效解决办法
- 【KVM系列04】KVM的I/O 设备直接分配和SR-IOV
- Excel转换成Json工具
- Android读取电话薄中的电话号码
- chartControl控件常用属性总结
- FL Studio使用外部音源播放导入的MIDI文件
- 完整的网站前端+源码模板
- 浅谈2020年国内第三方支付平台安全性
- /deep/的使用与导致样式失效问题处理
- python足球作画
- qt(qu chu biao ti lan /窗口非暴力置顶)
- 不等距双杆模型_电磁感应的双杆模型——不等距无拉力
- ks live room danmu
- 4、OOA 面向对象分析
- 如何用钢笔工具抠图ps教程ps学习
- 爬虫破解安居客等网址信息字体加密
- pancakeswap薄饼添加流动性后实现永久锁仓
- 离散数学与组合数学-01集合论
- Word 新建文件设置默认字体、字号、行距等
热门文章
- lisp 车位块自动编号_机械车位做产权登记,真的适合吗?
- 05_JS流程控制语句
- struct cdev结构体和cdev_init和cdev_add函数
- matlab计算位温,大气物理学复习资料
- Linux进程全解1——程序的开始、结束
- 内核启动的C语言阶段——start_kernel函数
- c语言中怎么 写子程序,哪位师傅知道51单片机怎样编写子程序?C语言的。在主程序里调...
- easyexcel 填充模板 格式变了_Qamp;A | 如何制作规范的电子合同模板?
- UVa-401-Palindromes(回文)
- zbb20180117 汉字转拼音 pinyin4