列表

详情


2111. 使数组 K 递增的最少操作次数

给你一个下标从 0 开始包含 n 个正整数的数组 arr ,和一个正整数 k 。

如果对于每个满足 k <= i <= n-1 的下标 i ,都有 arr[i-k] <= arr[i] ,那么我们称 arr 是 K 递增 的。

每一次 操作 中,你可以选择一个下标 i 并将 arr[i] 改成任意 正整数。

请你返回对于给定的 k ,使数组变成 K 递增的 最少操作次数 。

 

示例 1:

输入:arr = [5,4,3,2,1], k = 1
输出:4
解释:
对于 k = 1 ,数组最终必须变成非递减的。
可行的 K 递增结果数组为 [5,6,7,8,9],[1,1,1,1,1],[2,2,3,4,4] 。它们都需要 4 次操作。
次优解是将数组变成比方说 [6,7,8,9,10] ,因为需要 5 次操作。
显然我们无法使用少于 4 次操作将数组变成 K 递增的。

示例 2:

输入:arr = [4,1,5,2,6,2], k = 2
输出:0
解释:
这是题目描述中的例子。
对于每个满足 2 <= i <= 5 的下标 i ,有 arr[i-2] <= arr[i] 。
由于给定数组已经是 K 递增的,我们不需要进行任何操作。

示例 3:

输入:arr = [4,1,5,2,6,2], k = 3
输出:2
解释:
下标 3 和 5 是仅有的 3 <= i <= 5 且不满足 arr[i-3] <= arr[i] 的下标。
将数组变成 K 递增的方法之一是将 arr[3] 变为 4 ,且将 arr[5] 变成 5 。
数组变为 [4,1,5,4,6,5] 。
可能有其他方法将数组变为 K 递增的,但没有任何一种方法需要的操作次数小于 2 次。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int kIncreasing(vector<int>& arr, int k) { } };

python3 解法, 执行用时: 284 ms, 内存消耗: 28 MB, 提交时间: 2023-09-04 17:40:00

class Solution:
    def kIncreasing(self, arr: List[int], k: int) -> int:
        save = 0
        n = len(arr)
        for i in range(min(k, n)):
            f = []
            for j in range(i, n, k):
                v = arr[j]
                if (p := bisect.bisect_left(f, v+1)) < len(f):
                    f[p] = v
                else:
                    f.append(v)
            save += len(f)
        
        return len(arr) - save

python3 解法, 执行用时: 332 ms, 内存消耗: 28 MB, 提交时间: 2023-09-04 17:36:44

class Solution:
    def kIncreasing(self, arr: List[int], k: int) -> int:
    	save = 0
    	n = len(arr)
    	for i in range(min(k, n)):
    		f = []
    		for j in range(i, n, k):
    			v = arr[j]
    			p = bisect.bisect_left(f, v+1)
    			if p < len(f):
    				f[p] = v
    			else:
    				f.append(v)
    		save += len(f)
    	
    	return len(arr) - save

golang 解法, 执行用时: 164 ms, 内存消耗: 9 MB, 提交时间: 2023-09-04 17:30:55

// 最长不降子序列
func kIncreasing(arr []int, k int) int {
	save := 0
	for i, n := 0, len(arr); i < k && i < n; i++ {
		f := []int{}
		for j := i; j < n; j += k {
			v := arr[j]
			if p := sort.SearchInts(f, v+1); p < len(f) {
				f[p] = v
			} else {
				f = append(f, v)
			}
		}
		save += len(f)
	}
	return len(arr) - save
}

上一题