462. Minimum Moves to Equal Array Elements II
来源:互联网 发布:淘宝押金1000怎么上交 编辑:程序博客网 时间:2024/06/11 17:03
step1
把数组排序
step2
> 把排序后的数组**arr = [x1, x2, x3 ... xn]** 视为横轴上的n个整数
x1 x2 x3 ... xn
------------------------------------------------> 横轴
下面说出一个结论:
那么如果所有数字都变为同一个数a, 这个数必须是排在中间的数(数组若有奇数个数, 就是正中间的数, 若有偶数个, 则取这两个数的闭区间内的任一整数)
证明:
为了方便说明,我们先取一个数组[1, 2, 3, 4, 5, 8]
那么它们在数轴上的显示如下:
1 2 3 4 5 8
----------------------------------------------------------->
把他们每个头尾都分到一组, 每组有两个。
即(1, 8) (2, 5) (3, 4)
我们考虑(1, 8)这一组。
首先我们易得,题目的目标是找到一个整数n,让所有数字到那个数字的距离之和最小
那么要让距离之和最小, 每一组的两个数字到某个整数的距离之和(以下简称距离之和)都必须尽可能最小。
根据线段两点到第三点的距离之和最短为线段的长度原理,
要让(1, 8)的距离之和尽可能小,取点必须在[1, 8]内。
同理,
要让(2, 5)的距离之和尽可能小,取点必须在[2, 5]内。
所以,我们发现,所要寻找的那个整数n的范围最后被限制在最中间的两个数3与4之间,我们随意取[3, 4]中的一个整数,便可让所有组的距离之和最小。
所以此时的答案是各组的线段长度之和。
当数组长度为奇数个时
根据上面的思想,我们易得答案就是
先排序,
需要“向其靠拢”的数是最中间的那个数
然后把那个数以外的数两两分组,
把这些线段的长度相加即可。
class Solution {public: int minMoves2(vector<int>& nums) { sort(nums.begin(), nums.end()); // 排序 int len = nums.size(); int mid = nums[len / 2]; // 找到中间的数 int total = 0; for(int i = 0; i < len / 2; i++){ // 把每个数到中间数的距离相加, 得到result int latter = nums[len - 1 - i]; int former = nums[i]; int dis = latter - former; total += dis; } return total; }};
- Minimum Moves to Equal Array Elements II
- Minimum Moves to Equal Array Elements II
- Minimum Moves to Equal Array Elements II
- 【leetcode】462. Minimum Moves to Equal Array Elements II【M】
- 462. Minimum Moves to Equal Array Elements II
- 462. Minimum Moves to Equal Array Elements II
- LeetCode 462. Minimum Moves to Equal Array Elements II
- 462. Minimum Moves to Equal Array Elements II
- LeetCode笔记:462. Minimum Moves to Equal Array Elements II
- 462. Minimum Moves to Equal Array Elements II 难度:medium
- LeetCode 462. Minimum Moves to Equal Array Elements II
- Leetcode-462. Minimum Moves to Equal Array Elements II
- 【LeetCode】 462. Minimum Moves to Equal Array Elements II
- 462. Minimum Moves to Equal Array Elements II**
- LeetCode 462. Minimum Moves to Equal Array Elements II
- LeetCode 462. Minimum Moves to Equal Array Elements II
- 462. Minimum Moves to Equal Array Elements II
- [LeetCode]462. Minimum Moves to Equal Array Elements II
- java学习笔记之线程5
- 自定义控件之下拉刷新列表
- TensorFlow Wide And Deep 模型详解与应用 TensorFlow Wide-And-Deep 阅读344 作者简介:汪剑,现在在出门问问负责推荐与个性化。曾在微软雅虎工作,
- SCI 投稿Cover letter模板大全 (2012-01-12 16:20:30)转载▼ 标签: e-mail 稿号 意见 修改稿 信件 杂谈分类: technology 1.第一次投稿Cov
- Mybatis的功能之一:数据库表自动生成对应的model类,dao接口和Mapper.xml文件
- 462. Minimum Moves to Equal Array Elements II
- python: input()、raw_input() 探究
- 新人报道,占个坑
- ORB-SLAM:文献阅读笔记
- Curl 示例
- 如何用命令行查IP?
- java学习思维导图
- Java常见面试(12)
- 矩阵快速幂(二分)