K個最近的點
阿新 • • 發佈:2017-08-07
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[]{newPoint(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個最近的點