[LeetCode]462. Minimum Moves to Equal Array Elements II

    xiaoxiao2021-03-25  142

    https://leetcode.com/problems/minimum-moves-to-equal-array-elements-ii/?tab=Description

    数组每个元素可以加一减一,问需要多少步操作所有元素均相等

    找中位数,两头往中位数靠拢.

    也可以快排之后,两头往中间靠拢res += nums[j--] - nums[i++]

    public class Solution { public int minMoves2(int[] nums) { int mid = findMid(nums); int res = 0; for (int num : nums) { res += Math.abs(num - mid); } return res; } private int findMid(int[] nums) { return findKth(nums, 0, nums.length - 1, (nums.length - 1) / 2); } private int findKth(int[] nums, int beg, int end, int k) { if (beg >= end) { return nums[beg]; } int mid = partition(nums, beg, end); if (mid == k) { return nums[mid]; } else if (mid > k) { return findKth(nums, beg, mid - 1, k); } else { return findKth(nums, mid + 1, end, k); } } private int partition(int[] nums, int beg, int end) { if (beg >= end) { return beg; } int temp = nums[beg]; while (beg < end) { while (beg < end && nums[end] >= temp) { end--; } nums[beg] = nums[end]; while (beg < end && nums[beg] < temp) { beg++; } nums[end] = nums[beg]; } nums[beg] = temp; return beg; } }

    转载请注明原文地址: https://ju.6miu.com/read-18706.html

    最新回复(0)