2652.倍数求和

2652. 倍数求和 - 力扣(LeetCode)

给你一个正整数 n ,请你计算在 [1,n] 范围内能被 357 整除的所有整数之和。

返回一个整数,用于表示给定范围内所有满足约束条件的数字之和。

示例 1:

输入:n = 7
输出:21
解释:[1, 7] 范围内能被 3、5、7 整除的所有整数分别是 3、5、6、7 。数字之和为 21

示例 2:

输入:n = 10
输出:40
解释:[1, 10] 范围内能被 3、5、7 整除的所有整数分别是 3、5、6、7、9、10 。数字之和为 40

示例 3:

输入:n = 9
输出:30
解释:[1, 9] 范围内能被 3、5、7 整除的所有整数分别是 3、5、6、7、9 。数字之和为 30

提示:

  • 1 <= n <= 103

思路解析

枚举,直接从一开始暴力求解

完整代码

class Solution {
    public int sumOfMultiples(int n) {
        int sum = 0;
      for(int i=1;i<=n;i++){
          if(i%3==0){
            sum+=i;
          }
       else if(i%5==0){
              sum+=i;
          }
          else if(i%7==0){
              sum+=i;
          }
          else{
              continue;
          }
          
      }
      return sum;
    }
}

思路

用的堆,主要思想是贪心,每次计算第i次就是第i次的分数除3,这个k≤105k \leq 10^5k≤105,意味着可以直接模拟。思路很明显,每次贪最大的数,而为了高效获得最大值,可以将所有数都放入到大根堆中。每次分数加上堆顶的元素,并弹出堆顶valvalval,将其变为ceil(val3)ceil(\frac{val}{3})ceil(3val​)后再放回堆中,以保持堆顶始终是最大值,重复这个过程kkk次即可。

完整代码

class Solution {
    public long maxKelements(int[] nums, int k) {
        PriorityQueue<Integer> q = new PriorityQueue<Integer>((a, b) -> b - a);
        for (int num : nums) {
            q.offer(num);
        }
        long ans = 0;
        for (int i = 0; i < k; ++i) {
            int x = q.poll();
            ans += x;
            q.offer((x + 2) / 3);
        }
        return ans;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值