public int minMoves(int[] nums, int k) {
var p = new ArrayList<Integer>();
for (int i = 0; i < nums.length; ++i)
if (nums[i] != 0) p.add(i - p.size());
int m = p.size();
int[] s = new int[m + 1]; // p 的前缀和
for (int i = 0; i < m; i++)
s[i + 1] = s[i] + p.get(i);
int ans = Integer.MAX_VALUE;
for (int i = 0; i <= m - k; ++i) // p[i] 到 p[i+k-1] 中所有数到 p[i+k/2] 的距离之和,取最小值
ans = Math.min(ans, s[i] + s[i + k] - s[i + k / 2] * 2 - p.get(i + k / 2) * (k % 2));
return ans;
}
2022.12.18-----leetcode.1703
最新推荐文章于 2024-07-24 22:13:06 发布