首页 > 编程语言 >算法题总结-均等划分

算法题总结-均等划分

时间:2023-06-19 17:12:33浏览次数:48  
标签:总结 status ratio nums int self minList 算法 均等

原题
https://leetcode.cn/problems/partition-to-k-equal-sum-subsets/submissions/
给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。[1 <= k <= len(nums) <= 16]
输入示例

nums = [4, 3, 2, 3, 5, 2, 1], k = 4

输出示例

True

官方解法:
核心在于回溯算法。回溯算法即,尝试是否能找到,如果能找到所有组合即返回,如果没找到,就返回上层递归,重新尝试新组合
解析:
1.每件物品能且仅能取一次,因此,肯定需要保存每次尝试组合时,物品的状态(因为后续必须要用到@cache提速 因此状态必须用二进制来判断从而使得状态变成单个数字)
2.由于每个物品都要尝试组合,因此,不能在取出一组就返回,因此,递归过程中,组合目标值必须通过取余运算,每次取完一组就重置(例如 19%19==0)
3.组合递归函数的特殊返回:
3.1 每件物品取完了 且目标值重置了[正常找到所有组合了]
3.2 for循环遍历过后没有找到正常的组合

源码:

class Solution:
    def __init__(self):
        self.value = 0
        self.minList = []
        pass
    
    @cache
    def recurisive(self,status:int,ratio:int)->bool:
        '''
        通过递归确定组合策略
        :param status: 每个数字的使用情况
        :param minList: 实际使用的数组
        :param ratio: 每次递归需要拼出来的值
        :param assemble: 上层已经拼出来的策略
        :return:
        '''
        if status==0 and ratio==0:
            return True
        for i in range(len(self.minList)):
            if ratio+self.minList[i]>self.value:
                continue
            if (status>>i) & 1:
                if self.recurisive(status-pow(2,i),int((ratio+self.minList[i])%self.value)):
                    return True
        return False

    def canPartitionKSubsets(self,nums:list[int],k:int)->bool:
        sumValue = sum(nums)
        if sumValue%k == 0:
            ratio = sumValue//k
            minList = []
            equalList = []
            for item in nums:
                if item<ratio:
                    minList.append(item)
                elif item==ratio:
                    equalList.append([item])
                else:
                    return False
            if len(equalList)==k:
                return True
            # 状态列表 1:未用 0:使用
            status = pow(2,len(minList))-1
            # 排序 首先确定最大值对应的策略[如果先确定最小值的策略 最大值很大可能拼不出来 例如 ratio=19 [1,1,1,.....,18]]
            minList.sort()
            self.minList = minList[::-1]
            self.value = ratio
            # 如果并不是一个数字一个策略 那么就肯定需要排列组合来确定
            out = self.recurisive(status,0)
            return out
        else:
            return False

标签:总结,status,ratio,nums,int,self,minList,算法,均等
From: https://www.cnblogs.com/dengliang356a/p/17491600.html

相关文章

  • 代码随想录算法训练营第十一天| 239. 滑动窗口最大值 347.前 K 个高频元素
    239.滑动窗口最大值 难点:1,想好怎么快速找到区块内的最大数值,往常使用的是在遍历一次,但是是O(m*n)思路:1,使用单调队列,所有的数值都必须是从大到小,2,用队列保持必要的顺序,而且对于大于K的循环,每次都要求poppush这两个操作代码:1voidpop(deque<int>&slidingWin......
  • [参会感悟] 第六届全国定量遥感会议(成都)参会总结
    关键词:定量遥感会议、成都、报告、感悟作者:ludwig1860日期:2023.6.19全国定量遥感会议是遥感领域的国内盛会,每届都能吸引国内的大牛与新锐们参加与报告。其实从今年三月份发会议1号通知的那个时候起,我就重视起来了,毕竟两年一次,是该好好呈现汇报一下过去两年的研究成果了。1.......
  • 2022年Android大厂面试题(面经)总结(小红书、快手、爱奇艺、微信、抖音.....)
    小红书Android一面Java篇静态变量和实例变量的区别静态变量有static关键字修饰静态变量不属于某个实例对象,而是属于类,也叫类变量,只要程序加载了类的字节码,不用创建任何实例对象就会被分配空间,就可以被使用,也就是说,你创建了多个对象,他们共用了一个静态变量,而实例对象是属于自己的独......
  • 正则表达式工作实践总结
    正则表达式是一种非常强大和灵活的工具,它可以提供基于模式匹配的文本检索和替换功能,广泛应用于文本处理、字符串操作、数据校验等领域。在 JavaScript 中,正则表达式是内置的一种数据类型,可以通过字面量 /pattern/ 或者构造函数 RegExp() 来创建。在我们的工作中,根据不同的业......
  • 算法与数据结构Day03——平衡二叉树的根
    #include<stdio.h>#include<stdlib.h>typedefstructnode*AVLTree;structnode{intData;AVLTreeLeft;AVLTreeRight;};intHigh(AVLTreeT){if(!T)return0;intleft=High(T->Left)+1;intright=High(T->......
  • Java 编码(一)Java实现SHA256算法
    本文实例讲述了JavaSHA-256加密的两种实现方法。分享给大家供大家参考,具体如下:参考文献 Java实现SHA256算法-自学java的小陈-博客园(cnblogs.com)1、利用Apache的工具类实现加密:maven:<dependency><groupId>commons-codec</groupId><artifactId>commons-codec</......
  • 探索 Stream 流的强大功能和算法
    Java8引入了StreamAPI,为处理集合数据提供了一种更便捷、高效的方式。Stream流提供了一套丰富的API,可以让开发者更简洁、优雅地处理数据。本文将介绍JavaStream流的基本概念、核心特性和常见用法,帮助您更好地理解和应用Stream流。简介Stream是Java8引入的一个概念......
  • 详解4种模型压缩技术、模型蒸馏算法
    摘要:本文主要为大家讲解关于深度学习中几种模型压缩技术、模型蒸馏算法:Patient-KD、DistilBERT、DynaBERT、TinyBERT。本文分享自华为云社区《深度学习实践篇[17]:模型压缩技术、模型蒸馏算法:Patient-KD、DistilBERT、DynaBERT、TinyBER》,作者:汀丶。1.模型压缩概述1.1模型压缩......
  • 阿里钉钉Android实习面试也太太太太难了吧,对算法的要求堪比字节
    本人研究生在读,在2月26日找了师兄内推阿里钉钉团队,28号接到了约1面的电话。幸好我提前准备了一个多月的样子,刷面试题、刷LeetCode(面了之后才觉得自己刷少了),对于我这样一个实习生来说题目还是有些偏难,不过在4月20号终于拿到意向书了,听内推人说阿里实习面试没有rank,可能单纯就是流程......
  • 大厂技术总监总结的Android Framework开发笔记火了!知乎已1.7k赞!不吃透都对不起他
    为什么要学AndroidFramework?想要成为一名优秀的Android开发,就需要有一个完备的知识体系,AndroidFramework的知识是很重要的一个组成部分,他广泛的应用在各个领域。像掉帧监控,函数插装,慢函数检测,ANR监控,启动监控,都需要对Framework有比较深入的了解。只有这样才能知道怎么去做监......