title: 【leetcode】sort
date: 2018-02-08 13:38:35
tags:categories:
leetcode 排序相关问题
Largest Number
题目
Given a list of non negative integers, arrange them such that they form the largest number.
For example, given
[3, 30, 34, 5, 9]
, the largest formed number is9534330
.Note: The result may be very large, so you need to return a string instead of an integer.
给定数组返回由该数组构成的最大数字,返回string类型
思路
先把数字转化成字符串,然后按字符串顺序排序,这里有一个小技巧,判断字符串s1和s2谁应该放在前面时,比较s1+s2和s2+s1
代码
|
Maximum Gap
题目
Given an unsorted array, find the maximum difference between the successive elements in its sorted form.
Try to solve it in linear time/space.
Return 0 if the array contains less than 2 elements.
You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range.
给定一个无序数组,返回数组中相邻元素(排序后)之差的最大值
复杂度要求:线性时间复杂度
分析
baseline:排序,计算相邻元素最大值,时间复杂度
优化:桶排序
- 确定数组中最大和最小元素max和min,数组中元素个数N
- 这N个数字的平均间隔为:avg = (max-min)/(N-1),maxGap >= avg,所以我们令桶的大小int
bucketSize = Math.max(1,(max - min) / (N-1));
这样每一个桶内,元素的差值不会超过avg了,那么相邻元素之间的最大间隔一定在桶之间。 - 根据桶的大小,可以计算出桶的个数为
int bucketNum = (max - min)/bucketSize + 1;
, - 遍历数组中的元素,将元素放入对应的桶中,并维护每个桶的最大值和最小值
- 计算相邻桶的最小值和最大值的差,遇到桶中没有元素的跳过,取最大的差值即为所求。
代码
|
Best Meeting Point
题目
A group of two or more people wants to meet and minimize the total travel distance. You are given a 2D grid of values 0 or 1, where each 1 marks the home of someone in the group. The distance is calculated using Manhattan Distance, where distance(p1, p2) =
|p2.x - p1.x| + |p2.y - p1.y|
.For example, given three people living at
(0,0)
,(0,4)
, and(2,2)
:
> 1 - 0 - 0 - 0 - 1> | | | | |> 0 - 0 - 0 - 0 - 0> | | | | |> 0 - 0 - 1 - 0 - 0>
>
The point
(0,2)
is an ideal meeting point, as the total travel distance of 2+2+2=6 is minimal. So return 6.
给定二维数组,1代表n个人的出发地,0代表其余地点,找到数组中的一个位置,使得大家到这个地点的曼哈顿距离之和最短,返回最短距离
思路
只想到了暴力的思路。。。
看了solution,需要从一维的入手:
|
给了这么几个例子,说明到所有点最短的距离就是中位数的点。
所以扩展到二维,到所有点距离最短的点就是所有点分别在x轴和y轴中位数的点。
因此可以遍历所有的点,记录是1的点的xy坐标,然后分别对xy坐标排序,取中位数的点,即为要求的点,再计算下距离就好。
优化:
可以把横纵坐标分离计算,按需加入list,这样就不需要排序了,直接取中位数位置的点
代码
|
Insert Interval
题目
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).
You may assume that the intervals were initially sorted according to their start times.
Example 1:
Given intervals[1,3],[6,9]
, insert and merge[2,5]
in as[1,5],[6,9]
.Example 2:
Given[1,2],[3,5],[6,7],[8,10],[12,16]
, insert and merge[4,9]
in as[1,2],[3,10],[12,16]
.This is because the new interval
[4,9]
overlaps with[3,5],[6,7],[8,10]
.
给定区间数组,区间之间没有overlap,又给定一个独立区间,将该独立区间加到数组的区间里,如有overlap将区间merge,返回加入独立区间后的数组
思路
- 遍历数组中的区间,当数组中的区间和独立区间还没有交集(intervals.get(i).end < newInterval.start)的时候,将这些区间原封不动放入result中
- 将区间start和end初始化为newInterval的start和end
- 继续遍历数组中的区间,直至intervals.get(i).start > newInterval.end,也就是和独立区间不相交了,在此期间,更新数组的上下边界
- 将更新好的区间加入结果
- 将剩余区间加入结果
代码
|