首页 > 其他分享 >LeetCode 698

LeetCode 698

时间:2022-09-20 19:59:02浏览次数:106  
标签:return nums int 698 LeetCode current vector targets

LeetCode 2022.9.20 的打卡题目

698 划分为k个相等的子集 [https://leetcode.cn/problems/partition-to-k-equal-sum-subsets]

给定一个整数数组  nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。

示例 1:

输入: nums = [4, 3, 2, 3, 5, 2, 1], k = 4
输出: True
说明: 有可能将其分成 4 个子集(5),(1,4),(2,3),(2,3)等于总和。
示例 2:

输入: nums = [1,2,3,4], k = 3
输出: false

提示:

1 <= k <= len(nums) <= 16
0 < nums[i] < 10000
每个元素的频率在 [1,4] 范围内

解法1 搜索剪枝

回溯法,枚举每个数字是否放进某个组里。
但是直接搜索会超时。
剪枝思路:

  1. 从大到小对数字进行排序,这样有比较大的概率在 (targets[i] >= nums[current])这一步进行跳过;
  2. 对于已经处理过的同样大小的组,如果当前数没有成功放进去,那它就不需要再次进行计算了,这一步剪枝可以使搜索算法通过此题。这里用unordered_set存储了一下已经废掉的解;网上题解多是使用targets[i] == targets[i - 1]来判断,好像会更快一些。
class Solution {
public:
    bool dfs(vector<int>& nums, vector<int>& targets, int current) {
        if (current == nums.size()) {
            for (int i = 0; i < targets.size(); ++i) {
                if (targets[i]) {
                    return false;
                }
            }
            return true;
        }

        unordered_set<int> unsolved;

        for (int i = 0; i < targets.size(); ++i) {
            if ((solved.find(targets[i]) == unsolved.end()) && targets[i] >= nums[current]) {
                targets[i] -= nums[current];
                if (dfs(nums, targets, current + 1)) {
                    return true;
                }
                targets[i] += nums[current];
                unsolved.insert(targets[i]);
            }
        }
        return false;
    }

    bool canPartitionKSubsets(vector<int>& nums, int k) {
        int sum = accumulate(begin(nums), end(nums), 0);
        if (sum % k != 0) {
            return false;
        }

        sort(begin(nums), end(nums), greater<int>());

        vector<int> targets(k, sum / k);
        return dfs(nums, targets, 0);
    }
};

标签:return,nums,int,698,LeetCode,current,vector,targets
From: https://www.cnblogs.com/biyufei/p/16712250.html

相关文章

  • 9.20Leetcode记录
    一、字符串的排列题干:输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例:输入:s="abc"输出:["abc","a......
  • LeetCode/划分k个相等的子集
    给定一个整数数组nums和一个正整数k,找出是否有可能把这个数组分成k个非空子集,其总和都相等一.回溯法1.对每个数,回溯放入子集(球视角)只关心每个球是否成功放入,......
  • [LeetCode] 954. Array of Doubled Pairs
    Givenanintegerarrayofevenlength arr,return true ifitispossibletoreorder arr suchthat arr[2*i+1]=2*arr[2*i] forevery 0<=i<le......
  • LeetCode448. Find All Numbers Disappeared in an Array
    题意n个数,统计1-n中未出现的数方法遍历和标记代码classSolution{public:vector<int>findDisappearedNumbers(vector<int>&nums){sort(nums.beg......
  • [Leetcode Weekly Contest]311
    链接:LeetCode[Leetcode]2413.最小偶倍数给你一个正整数n,返回2和n的最小公倍数(正整数)。根据题意,当n为奇数时,答案为2n,当n为偶数时,答案为n。classSolution......
  • LeetCode — 跳跃游戏 III
    LeetCode—跳跃游戏III问题陈述给定一个非负整数数组arr,您最初位于开始数组的索引。当你在索引一世,你可以跳到i+arr[i]或者i—arr[i],检查是否可以......
  • LeetCode链表翻转
    SwapNodesinPairsLeetCode/力扣递归交换之后,直接交换下一个节点ListNode*swapPairs(ListNode*head){if(head&&head->next){swap(head->val,......
  • LeetCode深度优先搜索
    ValidateBinarySearchTreeLeetCode/力扣递归boolisValidBST(TreeNode*root){doublelower=DBL_MIN;doubleupper=DBL_MAX;returnhelper(root......
  • LeetCode广度优先搜索
    BinaryTreeLevelOrderTraversalLeetCode/力扣递归voidlevelOrderHelper(vector<vector<int>>&res,intlevel,TreeNode*root){if(root==NULL)return;......
  • Leetcode solution 2353. Design a Food Rating System
     ProblemStatement Designafoodratingsystemthatcandothefollowing:Modify theratingofafooditemlistedinthesystem.Returnthehighest-rated......