LintCode題解| Hulu 面試題:Maximum Slope Straight Line


九章算法 | Hulu 面試題:Maximum Slope Straight Line


題目描述

給出一系列平面直角座標系中的整數點 (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);
            }
        }
    }
}複製代碼
相關文章
相關標籤/搜索