首页 > 其他分享 >力扣-划分为k个相等的子集

力扣-划分为k个相等的子集

时间:2023-08-06 17:45:39浏览次数:34  
标签:subset 相等 nums int subsum mark 力扣 子集

1.问题描述

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

示例 1:

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

输出: True

2.说明

有可能将其分成 4 个子集(5),(1,4),(2,3),(2,3)等于总和。

输入说明:

首先输入nums数组的长度n,

然后输入n个整数,以空格分隔。

最后输入k。

1 <= k <= n <= 16

0 < nums[i] < 10000

输出说明:

输出true或false

3.范例

输入:

7
4 3 2 3 5 2 1
4

输出:

true

4.思路

k个非空子集综合都相等,即在nums数组元素的总和除以k就是各个子集的和,设各个子集的和为:subsum,遍历数组,找到元素和为subnum的子集。

通过mark标记已经遍历过的元素,放止重复遍历。

5.代码

#include <iostream>
#include <vector>
#include <stdio.h>

using namespace std;
class Solution
{
public:
    bool subset(vector<int> &nums,int k)
    {
        int len=nums.size();
        if(len<k)
            return false;
        int sum=0;
        for(int i=0;i<nums.size();i++)
            sum +=nums[i];
        if(sum%k!=0)
            return false;
        vector<int> mark(len,0);//标记数字是否已被选中,初始化为0
        return get_k_subset(nums,mark,sum/k,0,0,k);
    }
private:
    bool get_k_subset(vector<int> &nums,vector<int> &mark,
                      int subsum,int cursum,int start,int k)
        //subsum=sum/k;//每个子集的和
        //cursum;//表示当前子集和
        //start;//表示数组从start位置开始查找
    {
        if(k==1)
            return true;
        if(cursum==subsum)
            return get_k_subset(nums,mark,subsum,0,0,k-1);
        for(;start<nums.size();start++)
        {
            if(mark[start]==1) //1时,表示被标记过
                continue;
            mark[start]=1;
            if(get_k_subset(nums,mark,subsum,cursum+nums[start],start+1,k))
                return true;
            mark[start]=0;
        }
        return false;
    }
};
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    Solution solve;
    int n;
    cin>>n;
    vector<int> nums;
    int data;
    for(int i=0;i<n;i++)
    {
        cin>>data;
        nums.push_back(data);
    }
    int k;
    cin>>k;
    bool res=solve.subset(nums,k);
    cout<<(res? "true":"false")<<endl;
    return 0;
}

 

标签:subset,相等,nums,int,subsum,mark,力扣,子集
From: https://www.cnblogs.com/ohye/p/17609656.html

相关文章

  • 力扣-有效的井字游戏
    1.问题描述用字符串数组作为井字游戏的游戏板board。当且仅当在井字游戏过程中,玩家有可能将字符放置成游戏板所显示的状态时,才返回true。该游戏板是一个3x3数组,由字符"","X"和"O"组成。字符""代表一个空位。以下是井字游戏的规则:玩家轮流将字符放入空位("")中。......
  • 【动态规划】【力扣357次周赛】6953. 判断是否能拆分数组
    【力扣357次周赛】6953.判断是否能拆分数组给你一个长度为n的数组nums和一个整数m。请你判断能否执行一系列操作,将数组拆分成n个非空数组。在每一步操作中,你可以选择一个长度至少为2的现有数组(之前步骤的结果)并将其拆分成2个子数组,而得到的每个子数组,至少需......
  • 代码随想录算法训练营第七天|力扣334.反转字符串、力扣541.反转字符串II、剑指offer05
    字符串反转字符串(力扣344.)如果题目关键的部分直接用库函数就可以解决,建议不要使用库函数。毕竟面试官一定不是考察你对库函数的熟悉程度,如果使用python和java的同学更需要注意这一点,因为python、java提供的库函数十分丰富。如果库函数仅仅是解题过程中的一小部分,并且......
  • 力扣-24. 两两交换链表中的节点
     题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 =publicstaticListNodeswapPairs(ListNodehead){if(head==null||head.next==null)returnhead;......
  • 一支笔,一双手,一道力扣(Leetcode)做一宿
    (文章目录)一、分享自己相关的经历我是一名计算机专业的学生,之前在学习算法和数据结构时,对于简单题目还算能够顺利地刷过去。但是当我开始尝试刷一些medium难度的题目时,就感觉自己卡在原地了。明明看过题解,知道解题思路,但真正动手做题时,就觉得无从下手,甚至一道题目做了好几天都......
  • 代码随想录算法训练营第六天|力扣454.四数相加II、力扣383.赎金信、力扣15.三数之和、
    四数相加II(力扣454.)前两个数组的值直接遍历,并将和存入map中,key为和,value为出现次数后两个数组再次遍历,在map中寻找是否存在0-(c+d),若存在,count+=valuefor(a:A){//遍历ABfor(b:B){map[a+b]++;}}//insert操作for(c:C){for(d:D){target=0-(c+d);if(map.containsKey(t......
  • 枚举数组的所有子集
    参考: https://blog.csdn.net/weixin_43212830/article/details/122756392 https://blog.csdn.net/qq_34261446/article/details/103522369  /***@description:,枚举数组的所有子集*@author:luguilin*@date:2023-08-0116:22**/publicclassEnumAllSet......
  • 第 356 场周赛 - 力扣(LeetCode)
    第356场周赛-力扣(LeetCode)2798.满足目标工作时长的员工数目-力扣(LeetCode)一次遍历classSolution{public:intnumberOfEmployeesWhoMetTarget(vector<int>&hours,inttarget){intans=0;for(autoi:hours)ans+=......
  • 代码随想录算法训练营第五天|力扣242.有效的字母异位词、力扣242.两个数组的交集、力
    哈希表哈希表理论基础哈希表,又称为散列表(HashTable),是根据关键码的值而直接进行访问的数据结构其中,数组就是一张哈希表;表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素哈希表解决的问题:一般哈希表都是用来快速判断一个元素是否出现在集合中哈希函数:把学生的......
  • 力扣-接雨水2
    1.问题描述给你一个mxn的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。示例:给出如下3x6的高度图:[ [1,4,3,1,3,2], [3,2,1,3,2,4], [2,3,3,2,3,1]]返回4。如下图所示,这是下雨前的高度图[[1,4,3,1,3,2],[3......