使数组k递增的最少操作次数
2111. 使数组 K 递增的最少操作次数 - 力扣(LeetCode)
Solution
可以发现元素只与自己同余下标的元素有关系,所以可以直接分组做,分成k组。
分组之后,寻找每个组内的最长不下降子序列的长度,用这个组的总长度减去最长不下降子序列的长度就可以得到这一组需要修改的元素个数了。把每一组需要修改的个数累加起来就可以得到答案。
#include<iostream>
#include<vector>
using namespace std;class Solution {
public:int kIncreasing(vector<int>& arr, int k) {vector<vector<int>>nums(k);int ans = 0;for (int i = 0; i < arr.size(); ++i) {int m = i % k;nums[m].push_back(arr[i]);}for (int i = 0; i < k; ++i) {int len = nums[i].size();int lenOfLIS = lengthOfLIS(nums[i]);ans += len - lenOfLIS;}return ans;}int lengthOfLIS(vector<int>& nums) {int n = nums.size();vector<int>ends;ends.push_back(nums[0]);for (int i = 1; i < n; ++i) {int cur = nums[i];int index = bs(ends, cur);if (index == -1) {ends.push_back(cur);}else {ends[index] = cur;}}return ends.size();}int bs(vector<int>& nums, int target) {int l = 0, r = nums.size() - 1;int ans = -1;while (l <= r) {int mid = (l + r) >> 1;if (nums[mid] > target) {ans = mid;r = mid - 1;}else {l = mid + 1;}}return ans;}
};int main() {return 0;
}