当前位置: 首页 > news >正文

leetcode 368. 最大整除子集 中等

给你一个由 无重复 正整数组成的集合 nums ,请你找出并返回其中最大的整除子集 answer ,子集中每一元素对 (answer[i], answer[j]) 都应当满足:

  • answer[i] % answer[j] == 0 ,或
  • answer[j] % answer[i] == 0

如果存在多个有效解子集,返回其中任何一个均可。

示例 1:

输入:nums = [1,2,3]
输出:[1,2]
解释:[1,3] 也会被视为正确答案。

示例 2:

输入:nums = [1,2,4,8]
输出:[1,2,4,8]

提示:

  • 1 <= nums.length <= 1000
  • 1 <= nums[i] <= 2 * 10^9
  • nums 中的所有整数 互不相同

分析:

状态定义:dp[i] 表示在输入数组 nums 升序排列的前提下,以 nums[i] 为最大整数的「整除子集」的大小(在这种定义下 nums[i] 必须被选择)。

状态转移方程:枚举 j=0…i−1 的所有整数 nums[j],如果 nums[j] 能整除 nums[i],说明 nums[i] 可以扩充在以 nums[j] 为最大整数的整除子集里成为一个更大的整除子集。

初始化:由于 nums[i] 必须被选择,因此对于任意 i=0…n−1,初始的时候 dp[i]=1,这里 n 是输入数组的长度。

输出:由于最大整除子集不一定包含 nums 中最大的整数,所以我们需要枚举所有的 dp[i],选出最大整除子集的大小 maxSize,以及该最大子集中的最大整数 maxVal。按照如下方式倒推获得一个目标子集:

倒序遍历数组 dp,直到找到 dp[i]=maxSize 为止,把此时对应的 nums[i] 加入结果集,此时 maxVal=nums[i];

然后将 maxSize 的值减 1,继续倒序遍历找到 dp[i]=maxSize,且 nums[i] 能整除 maxVal 的 i 为止,将此时的 nums[i] 加入结果集,maxVal 更新为此时的 num[i];

重复上述操作,直到 maxSize 的值变成 0,此时的结果集即为一个目标子集。

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int cmp(const void *a,const void *b)
{
    int *aa=(int*)a;
    int *bb=(int*)b;
    return (*aa)-(*bb);
}

int* largestDivisibleSubset(int* nums, int numsSize, int* returnSize) {
    qsort(nums,numsSize,sizeof(int),cmp);

    int maxsize=1,maxnum=nums[0];
    int dp[numsSize+5];
    for(int i=0;i<numsSize;++i)
        dp[i]=1;
    for(int i=1;i<numsSize;++i)
    {
        for(int j=0;j<i;++j)
        {
            if(nums[i]%nums[j]==0)dp[i]=fmax(dp[i],dp[j]+1);
        }
        if(dp[i]>maxsize)
        {
            maxsize=fmax(dp[i],maxsize);
            maxnum=fmax(nums[i],maxnum);
        }
    }

    int *ans=(int*)malloc(sizeof(int)*numsSize);
    int t=0;

    for(int i=numsSize-1;i>=0;--i)
    {
        if(dp[i]==maxsize&&maxnum%nums[i]==0)
            ans[t++]=nums[i],maxsize--,maxnum=nums[i];
    }
    *returnSize=t;
    return ans;
}

http://www.dtcms.com/a/118442.html

相关文章:

  • Scala(六)
  • Matlab绘图—‘‘错误使用 plot输入参数的数目不足‘‘
  • 工程项目中通讯协议常见问题
  • 零代码构建AI知识库:基于亮数据网页抓取API的维基百科数据自动化采集实战
  • 昂贵的DOM操作:一次DOM导致的性能问题排查记录
  • 自动化测试是什么?Selenium实战!
  • 【分享开发笔记,赚取电动螺丝刀】使用STM32F103的hal库,采用PWM+DMA发送方式驱动WS2812的RGB彩灯
  • k8s介绍
  • Ansible 入门教程:从零开始掌握自动化运维
  • LiteFlow[规则引擎]简单介绍和它的设计模式
  • 【计网】HTTP协议 1.0/1.1/2.0详解
  • python分词工具汇总
  • 关于类模板STL中vector容器的运用和智能指针的实现
  • 开发PDF时,如何比较 PDF 文件
  • 解答严格模式
  • UE4初学笔记
  • windows下,cursor连接MCP服务器
  • TypeScript语言的计算机网络
  • JSON-LD 教程
  • 不花钱也能玩GPT-4o,国内可用
  • PyTorch使用(4)-张量拼接操作
  • Pinia 实战指南:Vue 3 的新一代状态管理工具
  • Springboot同时支持不同的数据库,Oracle,Postgresql
  • 【AI学习】初步了解TRL
  • pycharm 添加 pyside6 插件并修改 Ui 样式
  • 在亚马逊云科技上使用n8n快速构建个人AI NEWS助理
  • 与Linux操作系统相关的引导和服务
  • 图论:多源最短路
  • 【LeetCode77】组合
  • JS dom节点