1. 程式人生 > >K個最近的點

K個最近的點

ring int32 每天 rgs 開始 做的 sort 集合 錯誤

前段時間在網上看到一些準備找工作的人會在LintCode上刷題,然後我今天上去看了一下,也打算開始做題,然後把每天做的題目和以後的優化記錄下來。

2017年8月6日 21:17:27

第一題:

描述:給定一些 points 和一個 origin,從 points 中找到 k 個離 origin 最近的點。按照距離由小到大返回。如果兩個點有相同距離,則按照x值來排序;若x值也相同,就再按照y值排序。

樣例:給出 points = [[4,6],[4,7],[4,4],[2,5],[1,1]], origin = [0, 0], k = 3 返回 [[1,1],[2,5],[4,4]]


下面是我的代碼:

 1     class Point
 2     {
 3         public int x;
 4         public int y;
 5         public Point() { }
 6         public Point(int x,int y) { this.x = x;this.y = y; }
 7     }
 8     class Program
 9     {
10         static void Main(string[] args)
11         {
12             Point[] ps=new Point[]{new
Point(4,6),new Point(4,7),new Point(4,4) ,new Point(2,5),new Point(1,1)}; 13 Point[] pfinal = Closest(ps, new Point(0, 0), 3); 14 foreach(Point p in pfinal) 15 { 16 Console.WriteLine($"({p.x},{p.y})"); 17 } 18 Console.ReadKey();
19 } 20 static Point[] Closest(Point[] points,Point origin, int k) 21 { 22 Point[] plist = new Point[k]; 23 List<int> list = new List<int>(); 24 for(int i =0;i<points.Length;i++) 25 { 26 list.Add(GetLen(points[i], origin)); 27 } 28 list.Sort(); 30 for (int i = 0; i <points.Length; i++) 31 { 32 for(int j=0;j<k;j++) 33 { 34 if (list[j] == GetLen(points[i], origin)) 35 plist[j] = points[i]; 36 } 37 } 38 return plist; 39 } 40 static int GetLen(Point p1,Point p2)//獲取兩點間距離 41 { 42 return Convert.ToInt32(Math.Sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y))); 43 } 44 }

前一部分的思想是使用GetLen方法獲取每個點到給定點的距離,然後把距離添加到一個List集合中,然後將List使用Sort排序,輸出前K個點就可以了;

但是後來發現我無法區分哪個距離是哪個點和給定點之間的距離,都想使用Dictionary了。。。

然後問了一下室友,室友提供了一個方法:將距離保存到List集合後,再次遍歷所有點,判斷循環時當前點到給定點的距離和前k個距離相等時,獲取當前點即可。

雖然按照樣例中的數據測試是對的,但是對於對稱點我覺得會出現錯誤,所以明天有時間再更新一次!

K個最近的點