LeetCode·每日一题·2389. 和有限的最长子序列·贪心

作者:小迅

链接:https://leetcode.cn/problems/longest-subsequence-with-limited-sum/solutions/2174431/tan-xin-zhu-shi-chao-ji-xiang-xi-by-xun-4ff7v/

来源:力扣(LeetCode)

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

题目

LeetCode·每日一题·2389. 和有限的最长子序列·贪心_第1张图片

思路

题意 -> 给定两个数组,返回一个长度为 m 的数组 answer ,其中 answer[i] 是 nums 中 元素之和小于等于 queries[i] 的 子序列 的 最大 长度 。

直接按照题目意思进行模拟枚举即可。

在枚举之前需要进行一点小处理,因为我们要选择最大长度,所有可以先对nums进行排序,并求其前缀和,排序是为了每次取子序列的时候优先选择小的元素 (局部最优),从而使得取更长的序列(整体最优)。

求前缀和是为了快速判断当前 和 是否 小于等于 queries[i]

代码注释超级详细

代码


/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int cmp(const void *a, const void *b) //排序
{
    return *(int *)a - *(int *)b;
}
int* answerQueries(int* nums, int numsSize, int* queries, int queriesSize, int* returnSize){
    qsort(nums, numsSize, sizeof(int), cmp);//排序
    for (int i = 1; i < numsSize; ++i) {//求前缀和
        nums[i] += nums[i-1];
    }
    for (int i = 0; i < queriesSize; ++i) {//枚举每一个位置
        int n = 0;
        while (n < numsSize && queries[i] >= nums[n]) n++;//取最大序列
        queries[i] = n;//保存有效值
    }
    *returnSize = queriesSize;
    return queries;
}

作者:小迅
链接:https://leetcode.cn/problems/longest-subsequence-with-limited-sum/solutions/2174431/tan-xin-zhu-shi-chao-ji-xiang-xi-by-xun-4ff7v/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(LeetCode刷题笔记,linux,职场和发展,leetcode)