【教3妹学编程-算法题】2915. 和为目标值的最长子序列的长度

【教3妹学编程-算法题】2915. 和为目标值的最长子序列的长度_第1张图片

3妹:2哥,今日都立冬了, 可是天气一点都不冷。
2哥 : 立冬了,晚上要不要一起出去吃饺子?
3妹:好呀好呀,2哥请吃饺子喽
2哥 : 歪歪,我说的是一起出去吃,没说我请客好吧
3妹:哼,2哥真小气,请吃顿饺子都不肯!
2哥:这样,我们找一道算法题,后做出来的要请吃饺子,怎么样?
3妹:who 怕who, 来就来!

题目:

给你一个下标从 0 开始的整数数组 nums 和一个整数 target 。

返回和为 target 的 nums 子序列中,子序列 长度的最大值 。如果不存在和为 target 的子序列,返回 -1 。

子序列 指的是从原数组中删除一些或者不删除任何元素后,剩余元素保持原来的顺序构成的数组。

示例 1:

输入:nums = [1,2,3,4,5], target = 9
输出:3
解释:总共有 3 个子序列的和为 9 :[4,5] ,[1,3,5] 和 [2,3,4] 。最长的子序列是 [1,3,5] 和 [2,3,4] 。所以答案为 3 。
示例 2:

输入:nums = [4,1,3,2,1,5], target = 7
输出:4
解释:总共有 5 个子序列的和为 7 :[4,3] ,[4,1,2] ,[4,2,1] ,[1,1,5] 和 [1,3,2,1] 。最长子序列为 [1,3,2,1] 。所以答案为 4 。
示例 3:

输入:nums = [1,1,5,4,5], target = 3
输出:-1
解释:无法得到和为 3 的子序列。

提示:

1 <= nums.length <= 1000
1 <= nums[i] <= 1000
1 <= target <= 1000

思路:

【教3妹学编程-算法题】2915. 和为目标值的最长子序列的长度_第2张图片

背包,例如 nums前两个数的和是 5,那么枚举 j 的时候,最大只需要枚举 5,而不是 target

java代码:

class Solution {
    public int lengthOfLongestSubsequence(List nums, int target) {
        int[] f = new int[target + 1];
        Arrays.fill(f, Integer.MIN_VALUE);
        f[0] = 0;
        int s = 0;
        for (int x : nums) {
            s = Math.min(s + x, target);
            for (int j = s; j >= x; j--) {
                f[j] = Math.max(f[j], f[j - x] + 1);
            }
        }
        return f[target] > 0 ? f[target] : -1;
    }
}

你可能感兴趣的:(教3妹学编辑-算法篇,算法,数据结构,leetcode)