462. 最少移动次数使数组元素相等 II

122 篇文章 0 订阅
32 篇文章 0 订阅

原题链接:462. 最少移动次数使数组元素相等 II

 

solution:

        先排序,选择中位数进行移动。
假设一组数 1 3 7 10 5,排完序后 1 3 5 7 10,中位数为5,答案ans = (5 - 1) + (3 - 1) + (7 - 5) + (10 - 5) = 13 = (10 - 1) + (7 - 3)

class Solution {
public:
    int minMoves2(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int i = 0,j = nums.size() - 1;
        int ans = 0;
        while(i < j) {
            ans += nums[j--] - nums[i++];
        }
        return ans;
    }
};

要设计一个高效算法来对输入的整数 `x`, `y`, `z` 按照从小到大排序,可以采用一种名为“三路快速排序”的改进版排序算法。这是一种针对有大量重复元素的情况而优化的版本,它将数组分为三部分:小于基准值的部分、等于基准值的部分和大于基准值的部分。在这种情况下,我们选择中间值作为基准。 以下是使用 C++ 实现的简单示例: ```cpp #include <iostream> int partition(int arr[], int low, int high) { int pivot = arr[high]; // 选取中间值作为基准 int i = (low - 1); // 小于基准的左指针 for (int j = low; j <= high - 1; j++) { if (arr[j] < pivot) { i++; // 移动元素 std::swap(arr[i], arr[j]); // 交换位置 } } std::swap(arr[i + 1], arr[high]); // 把基准放在正确的位置 return i + 1; } void quickSort(int arr[], int low, int high) { if (low < high) { // 找到分区点 int pi = partition(arr, low, high); quickSort(arr, low, pi - 1); // 对小于基准的元素递归排序 quickSort(arr, pi + 1, high); // 对大于基准的元素递归排序 } } void printArray(int arr[], int size) { for (int i = 0; i < size; i++) std::cout << arr[i] << " "; std::cout << "\n"; } int main() { int x, y, z; // 输入三个整数 std::cin >> x >> y >> z; int arr[] = {x, y, z}; // 创建临时数组存储输入 int n = sizeof(arr) / sizeof(arr[0]); quickSort(arr, 0, n - 1); printArray(arr, n); return 0; } ``` 这个程序首先读取三个整数并存入数组,然后通过三路快速排序算法进行排序,并最后打印出结果。由于快速排序平均时间复杂度为 O(n log n),并且这里只需要一次遍历,所以满足了“高效的含义”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值