日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 1755. 最接近目标值的子序列和(状态枚举 + 双指针)

發布時間:2024/7/5 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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}2401012,肯定超時
  • 分治枚舉,取出一半來枚舉 220≈1062^{20} \approx 10^6220106,然后對兩半邊的狀態排序,雙指針求解
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. 最接近目标值的子序列和(状态枚举 + 双指针)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。