給出一系列平面直角座標系中的整數點 (x, y),從 0 開始編號,第 i 個點的編號爲 i。不存在任意兩點的橫座標相同,找出能構成的最大斜率直線的兩個點的編號 (a,b)。若是有多個這樣的點對,返回字典序最小的點對。面試
不管多少個點均可以任意選三個點組成一個三角形,那麼斜率最大的邊確定不是經過相鄰的兩個點,以此可知斜率最大的直線一點是由兩個相鄰的點畫出的。算法
本題主要考察觀察能力與快速排序,先將這些點按 x 排序,以後相鄰兩點中斜率最大的即爲答案,時間複雜度 O(nlogn)。bash
www.jiuzhang.com/solution/ma…ide
/**
* 本參考程序來自九章算法,由 @華助教 提供。版權全部,轉發請註明出處。
* - 九章算法致力於幫助更多中國人找到好的工做,教師團隊均來自硅谷和國內的一線大公司在職工程師。
* - 現有的面試培訓課程包括:九章算法班,系統設計班,算法強化班,Java入門與基礎算法班,Android 項目實戰班,
* - Big Data 項目實戰班,算法面試高頻題班, 動態規劃專題班
* - 更多詳情請見官方網站:http://www.jiuzhang.com/?source=code
*/
public class Solution {
/**
* @param points: The points set
* @return: Return the point pair
*/
class IndexPoint {
Point point;
int index;
IndexPoint() {
point = new Point();
index = 0;
}
IndexPoint(Point p, int i) {
point = p;
index = i;
}
}
public List<Integer> getPoints(Point[] points) {
int n = points.length;
IndexPoint[] p = new IndexPoint[n];
for (int i = 0; i < n; i++) {
p[i] = new IndexPoint(points[i], i);
}
Comparator cmp = new MyComparator();
Arrays.sort(p, cmp);
Integer[] a = new Integer[2];
a[0] = 0;
a[1] = 1;
for (int i = 1; i < n - 1; i++) {
long fct1 = (long) (p[i + 1].point.x - p[i].point.x) * (p[a[1]].point.y - p[a[0]].point.y);
long fct2 = (long) (p[a[1]].point.x - p[a[0]].point.x) * (p[i + 1].point.y - p[i].point.y);
if (fct1 < fct2 || fct1 == fct2 && p[i].index < a[0] && p[i + 1].index < a[0]) {
a[0] = i;
a[1] = i + 1;
}
}
a[0] = p[a[0]].index;
a[1] = p[a[1]].index;
if (a[0] > a[1]) {
int t = a[0];
a[0] = a[1];
a[1] = t;
}
List<Integer> ans = new ArrayList<>();
ans.add(a[0]);
ans.add(a[1]);
return (ans);
}
class MyComparator implements Comparator<IndexPoint> {
@Override
public int compare(IndexPoint o1, IndexPoint o2) {
if (o1.point.x < o2.point.x) {
return (-1);
} else if (o1.point.x > o2.point.x) {
return (1);
} else if (o1.index < o2.index) {
return (-1);
} else {
return (1);
}
}
}
}複製代碼