【LeetCode每日一题】2809. 使数组和小于等于 x 的最少时间

这篇具有很好参考价值的文章主要介绍了【LeetCode每日一题】2809. 使数组和小于等于 x 的最少时间。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

2024-1-19

2809. 使数组和小于等于 x 的最少时间

【LeetCode每日一题】2809. 使数组和小于等于 x 的最少时间,leetcode,算法,职场和发展

思路:
  1. 获取两个列表的长度n,并初始化一个二维数组f,用于存储最优解。
  2. 定义一个二维数组nums,用于存储输入的两个列表中的元素,并按照第二列元素进行排序。
  3. 使用动态规划的方法,通过遍历nums数组,计算最优解。其中,f[i][j]表示将前i个元素分配到j个集合中时的最大总和。通过比较f[i-1][j]和f[i-1][j-1]+a+b*j的大小,更新f[i][j]。
  4. 计算两个列表中所有元素的和,分别存储在s1和s2中。
  5. 遍历0至n的范围,判断是否满足条件s1 + s2 * j - f[n][j] <= x,若满足则返回j。
  6. 若没有满足条件的j值,则返回-1
class Solution {
    public int minimumTime(List<Integer> nums1, List<Integer> nums2, int x) {
        int n = nums1.size();
        int[][] f = new int[n + 1][n + 1]; // 定义二维数组f,用于存储最优解
        int[][] nums = new int[n][0]; // 定义二维数组nums,用于存储输入的两个列表中的元素
        for (int i = 0; i < n; ++i) {
            nums[i] = new int[] {nums1.get(i), nums2.get(i)}; // 将输入的两个列表中的元素按照相同的索引放入nums数组中
        }
        Arrays.sort(nums, Comparator.comparingInt(a -> a[1])); // 根据nums数组中第二列的元素进行排序
        for (int i = 1; i <= n; ++i) {
            for (int j = 0; j <= n; ++j) {
                f[i][j] = f[i - 1][j]; // 初始化f[i][j]为f[i-1][j]
                if (j > 0) { // 当j大于0时,进行以下操作
                    int a = nums[i - 1][0], b = nums[i - 1][1];
                    f[i][j] = Math.max(f[i][j], f[i - 1][j - 1] + a + b * j); // 更新f[i][j],取当前值与f[i-1][j-1]+a+b*j的较大值
                }
            }
        }
        int s1 = 0, s2 = 0;
        for (int v : nums1) {
            s1 += v; // 计算nums1列表中所有元素的和,存储在s1中
        }
        for (int v : nums2) {
            s2 += v; // 计算nums2列表中所有元素的和,存储在s2中
        }

        for (int j = 0; j <= n; ++j) {
            if (s1 + s2 * j - f[n][j] <= x) { // 判断是否满足条件 s1 + s2 * j - f[n][j] <= x
                return j; // 返回满足条件的j值
            }
        }
        return -1; // 若没有满足条件的j值,则返回-1
    }
}

点击移步博客主页,欢迎光临~

【LeetCode每日一题】2809. 使数组和小于等于 x 的最少时间,leetcode,算法,职场和发展文章来源地址https://www.toymoban.com/news/detail-812525.html

到了这里,关于【LeetCode每日一题】2809. 使数组和小于等于 x 的最少时间的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【LeetCode每日一题】——1365.有多少小于当前数字的数字

    排序 简单 1365.有多少小于当前数字的数字 给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。 换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != i 且 nums[j] nums[i] 。 以数组形式返回答案。 示例 1: 输入:nums = [

    2024年02月11日
    浏览(37)
  • 2023-08-20 LeetCode每日一题(判断根结点是否等于子结点之和)

    点击跳转到题目位置 给你一个 二叉树 的根结点 root,该二叉树由恰好 3 个结点组成:根结点、左子结点和右子结点。 如果根结点值等于两个子结点值之和,返回 true ,否则返回 false 。 示例 1: 示例 2: 提示: 树只包含根结点、左子结点和右子结点 -100 = Node.val = 100 (1) 直接

    2024年02月12日
    浏览(46)
  • 【LeetCode - 每日一题】1654. 到家的最少跳跃次数(23.08.30)

    可以左跳可以右跳 不能连续左跳两次 不能跳到负数 不能跳到 forbidden[] 求可以跳到 x 的最少跳跃次数 a. overview 最初时,只有 0 位置可以进行跳跃;在跳到 a 位置后,又可以跳到 2a 位置和 a-b 位置(如果 ab );然后又多了两个位置(或者一个位置)可以跳跃…因此这是一个

    2024年02月10日
    浏览(46)
  • 2023-06-17 LeetCode每日一题(分割圆的最少切割次数)

    点击跳转到题目位置 圆内一个 有效切割 ,符合以下二者之一: 该切割是两个端点在圆上的线段,且该线段经过圆心。 该切割是一端在圆心另一端在圆上的线段。 一些有效和无效的切割如下图所示。 给你一个整数 n ,请你返回将圆切割成相等的 n 等分的 最少 切割次数。

    2024年02月09日
    浏览(53)
  • 【LeetCode每日一题合集】2023.8.28-2023.9.3(到家的最少跳跃次数)

    https://leetcode.cn/problems/insert-interval/ 提示: 0 = intervals.length = 10^4 intervals[i].length == 2 0 = intervals[i][0] = intervals[i][1] = 10^5 intervals 根据 intervals[i][0] 按 升序 排列 newInterval.length == 2 0 = newInterval[0] = newInterval[1] = 10^5 当前区间与要加入的新区间之间的关系只有两种可能:相交或者不相

    2024年02月09日
    浏览(62)
  • 【LeetCode每日一题】2645. 构造有效字符串的最少插入数(计算组数+动态规划+考虑相邻字母)

    2024-1-11 2645. 构造有效字符串的最少插入数 方法一:计算组数 1.用count统计,能构成几组abc 2.如果当前字符大于之前字符,说明还在组内,不更新 3.如果当前字符小于等于之前字符,说明不是同一组的abc,组数更新 4.最终返回值:组数*3,再减去原本的字符数,就是要插入的次数

    2024年01月17日
    浏览(59)
  • (数组) 941. 有效的山脉数组 ——【Leetcode每日一题】

    难度:简单 给定一个整数数组 arr ,如果它是有效的山脉数组就返回 true ,否则返回 false 。 让我们回顾一下,如果 arr 满足下述条件,那么它是一个山脉数组: arr.length = 3 在 0 i arr.length - 1 条件下,存在 i 使得: arr[0] arr[1] ... arr[i-1] arr[i] arr[i] arr[i+1] ... arr[arr.length - 1] 示例

    2024年02月09日
    浏览(68)
  • ( 数组和矩阵) 697. 数组的度 ——【Leetcode每日一题】

    难度:简单 给定一个非空且只包含非负数的整数数组 nums ,数组的 度 的定义是指数组里任一元素出现频数的最大值。 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。 示例 1: 输入:nums = [1,2,2,3,1] 输出:2 解释: 输入数组的度是 2 ,因为

    2024年02月02日
    浏览(44)
  • LeetCode每日一题——1331.数组序号转换

    题目传送门 给你一个整数数组 arr ,请你将数组中的每个元素替换为它们排序后的序号。 序号代表了一个元素有多大。序号编号的规则如下: 序号从 1 开始编号。 一个元素越大,那么序号越大。如果两个元素相等,那么它们的序号相同。 每个数字的序号都应该尽可能地小。

    2024年02月14日
    浏览(37)
  • Leetcode每日一题——“合并两个有序数组”

    各位CSDN的uu们你们好呀,又到小雅兰的愉快题解时候啦,今天,我们的题目内容是合并两个有序数组,下面,让我们进入合并两个有序数组的世界吧 示例 1: 输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 输出:[1,2,2,3,5,6] 解释:需要合并 [1,2,3] 和 [2,5,6] 。 合并结果是 [ 1,2

    2023年04月24日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包