当前位置: 首页 > news >正文

LeetCode 3375.使数组的值全部为 K 的最少操作次数:O(1)空间——排序+一次遍历

【LetMeFly】3375.使数组的值全部为 K 的最少操作次数:O(1)空间——排序+一次遍历

力扣题目链接:https://leetcode.cn/problems/minimum-operations-to-make-array-values-equal-to-k/

给你一个整数数组 nums 和一个整数 k 。

如果一个数组中所有 严格大于 h 的整数值都 相等 ,那么我们称整数 h 是 合法的 。

比方说,如果 nums = [10, 8, 10, 8] ,那么 h = 9 是一个 合法 整数,因为所有满足 nums[i] > 9 的数都等于 10 ,但是 5 不是 合法 整数。

你可以对 nums 执行以下操作:

  • 选择一个整数 h ,它对于 当前 nums 中的值是合法的。
  • 对于每个下标 i ,如果它满足 nums[i] > h ,那么将 nums[i] 变为 h 。

你的目标是将 nums 中的所有元素都变为 k ,请你返回 最少 操作次数。如果无法将所有元素都变 k ,那么返回 -1 。

 

示例 1:

输入:nums = [5,2,5,4,5], k = 2

输出:2

解释:

依次选择合法整数 4 和 2 ,将数组全部变为 2 。

示例 2:

输入:nums = [2,1,2], k = 2

输出:-1

解释:

没法将所有值变为 2 。

示例 3:

输入:nums = [9,7,5,3], k = 1

输出:4

解释:

依次选择合法整数 7 ,5 ,3 和 1 ,将数组全部变为 1 。

 

提示:

  • 1 <= nums.length <= 100
  • 1 <= nums[i] <= 100
  • 1 <= k <= 100

解题方法:排序+遍历

这是一道阅读理解题。

先将数组从大到小排个序,若最小值小于 k k k则直接返回 − 1 -1 1,否则继续。

从(第二个元素开始)前到后遍历数组,若当前元素与上一个元素不同,则需要将上一个元素(和所有与之相等的元素)经过一次操作变成当前元素,操作次数加一。

最终(遍历完成后),数组中所有值都会变成 k k k。如果最小值不是 k k k,则还需要额外的一次变换将所有值都变成 k k k

  • 时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn),其中 n = l e n ( n u m s ) n=len(nums) n=len(nums)
  • 空间复杂度 O ( 1 ) O(1) O(1)

AC代码

C++
/*
 * @Author: LetMeFly
 * @Date: 2025-04-09 21:58:45
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-04-09 22:08:39
 */
#if defined(_WIN32) || defined(__APPLE__)
#include "_[1,2]toVector.h"
#endif

class Solution {
public:
    int minOperations(vector<int>& nums, int k) {
        sort(nums.begin(), nums.end(), greater<int>());
        if (nums.back() < k) {
            return -1;
        }
        int ans = 0;
        for (int i = 1; i < nums.size(); i++) {
            if (nums[i] != nums[i - 1]) {
                printf("nums[%d] = %d, nums[%d] = %d, ans = %d, ans++\n", i, nums[i], i - 1, nums[i - 1], ans);  // ****
                ans++;
            }
        }
        return ans + (nums.back() != k);
    }
};
Python
'''
Author: LetMeFly
Date: 2025-04-09 22:09:48
LastEditors: LetMeFly.xyz
LastEditTime: 2025-04-09 22:10:06
'''
from typing import List

class Solution:
    def minOperations(self, nums: List[int], k: int) -> int:
        nums.sort(reverse=True)
        if nums[-1] < k:
            return -1
        ans = 0
        for i in range(1, len(nums)):
            if nums[i] != nums[i - 1]:
                ans += 1
        return ans + (nums[-1] != k)
Java
/*
 * @Author: LetMeFly
 * @Date: 2025-04-09 22:12:36
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-04-09 22:15:42
 */
import java.util.Arrays;

class Solution {
    public int minOperations(int[] nums, int k) {
        Arrays.sort(nums);
        if (nums[0] < k) {
            return -1;
        }
        int ans = 0;
        for (int i = nums.length - 1; i > 0; i--) {
            if (nums[i] != nums[i - 1]) {
                ans++;
            }
        }
        if (nums[0] != k) {
            ans++;
        }
        return ans;
    }
}
Go
/*
 * @Author: LetMeFly
 * @Date: 2025-04-09 22:16:49
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-04-09 22:18:14
 */
package main

import "slices"

func minOperations(nums []int, k int) (ans int) {
    slices.Sort(nums)
    if nums[0] < k {
        return -1
    }
    for i := len(nums) - 1; i > 0; i-- {
        if nums[i] != nums[i - 1] {
            ans++
        }
    }
    if nums[0] != k {
        ans++
    }
    return
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

相关文章:

  • 递增子序列
  • 【前缀和】 K 整除的⼦数组(medium)
  • 【系统分析师-第二遍(19-22)】
  • 题目练习之动态规划(一)
  • 面向对象的要素
  • 基于多模态大模型的ATM全周期诊疗技术方案
  • LeetCode 第41~43题
  • ffmpeg函数简介(封装格式相关)
  • ecovadis评级的重要性,如何进行ecovadis评级,当下贸易环境有啥影响
  • HttpServletRequest是什么
  • 光度立体三维重建——光源标定
  • NO.74十六届蓝桥杯备战|搜索算法-BFS|马的遍历|迷宫|Catch That Cow|八数码难题(C++)
  • 前端配置husky,commit-lint导致的git提交错误:git xx@0.0.0 lint:lint-staged
  • 告别数据孤岛:Telegraf-IoTDB 实现一站式监控数据闭环
  • 392. 判断子序列
  • 013_File和IO流
  • 蓝桥云客--黑白皇后
  • fisco-bcos 关于服务bash status.sh启动runing 中但是5002端口监听不到,出错的问题
  • Dynamic Programming(LeetCode 740)
  • 串联所有单词的字串 --- 滑动窗口
  • 关于党风廉政建设的网站/河南网站优化公司
  • 网站的外链是怎么做的/湖北seo服务
  • 哪个网站建设公司/steam交易链接怎么看
  • 代做cad平面图的网站/网络营销推广方式有哪些
  • 做动漫网站要多少钱/百度推广课程
  • 网站怎么做百度推广/seo网站优化师