构成特定和需要添加的最少元素 - 贪心算法

本文介绍了如何运用贪心算法解决LeetCode中的5698题,即找到构成特定和所需的最少元素。文章指出,通过计算数组元素与目标值之差并除以限制值,可以确定需要添加的最少元素数量。注意处理负数和数值精度问题,最终实现了O(1)的时间和空间复杂度解决方案。
摘要由CSDN通过智能技术生成

5698. 构成特定和需要添加的最少元素


前言

提示:leetcode做题一定要看清楚题目,如果不懂题目可以去评论区看看大家对题目的理解。
忌讳:不懂题目的意思就答题


题目描述:

题目描述

一、解题关键

贪心算法,查看题目是否可以用贪心算法。初期可以查看这几个关键词:“最少”,“最多”,“最大”,“最小”…
"最"关键字一般都可以用贪心
后期题目做多了,自然水到渠成一眼救能看出,使用什么算法

一、我的答案

时间复杂度: O(1) ,空间复杂度: O(1)

1.1 注意内容:

  1. 题目描述中给的负数是障眼法,直接取其绝对值就好。
  2. 因为num[i] <=106 && num.length <= 105,所以计算时需要使用long,使用int会缺失精度

1.2 思路

因为题目是要给数组添加最少的元素,使其等于goal值。而添加的值的绝对值要小于 limit。根据者两点,我们可以得出不用去考虑,添加什么值。只要考虑在数组中添加的limit个数(因为添加的数越大,则加入数组的数字最少)

public int minElements(int[] nums, int limit, int goal) {
		// 计算nums的和
        long sum=0;
        for (int num:nums){
            sum+=num;
        }
        // 计算还需要添加的值,才能等于 goal
        long value = Math.abs(goal - sum);
        // 使用还需要添加的值 除以 limit得出,在数组中添加的最少元素个数
        int count = (int)((value) / (limit)); // 能整除,在数组添加的个数就是 count
        if ((value % limit) != 0) {
        // 不能整除,还需要在数组中添加一个数才能等于 goal
            count++;
        }
        return count;
    }

PS: 题目做多了,自然水到渠成一眼救能看出,使用什么算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值