文章目录

  • 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. 最接近目标值的子序列和(状态枚举 + 双指针)相关推荐

  1. 3. Leetcode 16. 最接近的三数之和 (数组-双向双指针)

    给你一个长度为 n 的整数数组 nums 和 一个目标值 target.请你从 nums 中选出三个整数,使它们的和与 target 最接近.返回这三个数的和.假定每组输入只存在恰好一个解.示例 1: ...

  2. LeetCode 2022春季赛 2. 烹饪料理(状态枚举)

    文章目录 1. 题目 2. 解题 1. 题目 欢迎各位勇者来到力扣城,城内设有烹饪锅供勇者制作料理,为自己恢复状态. 勇者背包内共有编号为 0 ~ 4 的五种食材,其中 meterials[j] 表示 ...

  3. LeetCode 272. 最接近的二叉搜索树值 II(栈+优先队列)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个不为空的二叉搜索树和一个目标值 target,请在该二叉搜索树中找到最接近目标值 target 的 k 个值. 注意: 给定的目标值 target ...

  4. LeetCode 270. 最接近的二叉搜索树值

    文章目录 1. 题目 2. 解题 2.1 暴力查找 2.2 二分查找 1. 题目 给定一个不为空的二叉搜索树和一个目标值 target,请在该二叉搜索树中找到最接近目标值 target 的数值. 注意 ...

  5. leetcode1300. 转变数组后最接近目标值的数组和

    给你一个整数数组 arr 和一个目标值 target ,请你返回一个整数 value ,使得将数组中所有大于 value 的值变成 value 后,数组的和最接近 target (最接近表示两者之差的 ...

  6. Leetcode 32 最长合法括号子序列

    算法特辑–动态规划 Leetcode 32 最长合法括号子序列 给定只有"(" 和 ")" 的字符串,求出最长的合法括号子序列. 例如:"())&qu ...

  7. 给定升序数组,以及目标值,查找出最接近目标值的所有数组组合

    给定升序数组,以及目标值,查找出最接近目标值的所有数组组合 解题思路: 1.已知给定的数组是升序的,需要找出和目标值target相近的一些数字的组合,我们通过先找出大于等于的一部分,把这部分先过滤,这 ...

  8. 365天挑战LeetCode1000题——Day 038 公交站间的距离 + 基于时间的键值存储 + 转变数组后最接近目标值的数组和 + 有界数组中指定下标处的最大值

    文章目录 1184. 公交站间的距离 代码实现(自解) 981. 基于时间的键值存储 代码实现(自解) 1300. 转变数组后最接近目标值的数组和 代码实现(自解) 1802. 有界数组中指定下标处的 ...

  9. LeetCode 659. 分割数组为连续子序列

    LeetCode 659. 分割数组为连续子序列 回顾 根据题意,每个元素只会涉及两种情况: 已经存在nums[i]-1结尾的序列,我们把nums[i]接到之前的某个序列后. 尝试以nums[i]为头 ...

最新文章

  1. 模拟海_浙江平湖“海水稻”丰收的背后,有这家来自上海企业的科技“秘方”...
  2. H5新特性 input type=date 在手机上默认提示显示无效解决办法
  3. 【KVM系列04】KVM的I/O 设备直接分配和SR-IOV
  4. Excel转换成Json工具
  5. Android读取电话薄中的电话号码
  6. chartControl控件常用属性总结
  7. FL Studio使用外部音源播放导入的MIDI文件
  8. 完整的网站前端+源码模板
  9. 浅谈2020年国内第三方支付平台安全性
  10. /deep/的使用与导致样式失效问题处理
  11. python足球作画
  12. qt(qu chu biao ti lan /窗口非暴力置顶)
  13. 不等距双杆模型_电磁感应的双杆模型——不等距无拉力
  14. ks live room danmu
  15. 4、OOA 面向对象分析
  16. 如何用钢笔工具抠图ps教程ps学习
  17. 爬虫破解安居客等网址信息字体加密
  18. pancakeswap薄饼添加流动性后实现永久锁仓
  19. 离散数学与组合数学-01集合论
  20. Word 新建文件设置默认字体、字号、行距等

热门文章

  1. lisp 车位块自动编号_机械车位做产权登记,真的适合吗?
  2. 05_JS流程控制语句
  3. struct cdev结构体和cdev_init和cdev_add函数
  4. matlab计算位温,大气物理学复习资料
  5. Linux进程全解1——程序的开始、结束
  6. 内核启动的C语言阶段——start_kernel函数
  7. c语言中怎么 写子程序,哪位师傅知道51单片机怎样编写子程序?C语言的。在主程序里调...
  8. easyexcel 填充模板 格式变了_Qamp;A | 如何制作规范的电子合同模板?
  9. UVa-401-Palindromes(回文)
  10. zbb20180117 汉字转拼音 pinyin4