【LeetCode-每日一題】-378. 有序矩陣中第K小的元素

1. 題目描述

在這裏插入圖片描述

2. 題目分析

  1. 這個題目類似於【劍指offer】-二維數組的查找-01/67
  2. 在此題的基礎上進行一些擴展,題目要求我們找到矩陣中第K小的元素,也就是在1~15的範圍中,找到第K小的數字。
  3. 我們對1~15進行二分,用mid來判斷當前矩陣中小於等於mid的的有多少(count),如果count小於K的話,也就是在證明當前的元素過於小,所以,需要left = mid + 1;如果count大於等於K的話,也就是證明當前的元素過於大或者正好,所以,需要right = mid。
  4. 這裏比較困惑的一點是,怎麼證明最後返回的left一定在數組內,咱們可以這樣想,首先對於第K小的元素,比如13,我們用二分找到的count只要是大於等於K的,肯定是大於等於13的,然後我們縮小mid的值,直到最後left == right,也就是最左邊的邊界(13),也可以理解成,在矩陣中,只有13,14是等於K的,我們需要找他最左邊的值。

3. 題目代碼

public int kthSmallest(int[][] matrix, int k) {
		int n = matrix.length;
		int left = matrix[0][0];
		int right = matrix[n - 1][n - 1];
		while (left < right) {
			int mid = (left + right) / 2;
			int i = n - 1;
			int j = 0;
			int num = 0;
			while (i >= 0 && j < n) {
				if (matrix[i][j] <= mid) {
					num += i + 1;
					j++;
				} else {
					i--;
				}
			}
			if (num >= k) { // 當前的數字 大於的過多 需要減少
				right = mid;
			} else {
				left = mid + 1;
			}
		}
		return left;
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章