Write an efficient algorithm that searches for a
- Integers in each row are sorted in ascending from left to right.
- Integers in each column are sorted in ascending from top to bottom.
Example 1:

Input: matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5 Output: true
Example 2:

Input: matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20 Output: false
Constraints:
m == matrix.length n == matrix[i].length 1 <= n, m <= 300 -109 <= matrix[i][j] <= 109 - All the integers in each row are sorted in ascending order.
- All the integers in each column are sorted in ascending order.
-109 <= target <= 109
Solution
差別在於,沒有保證下一行的數字都比上一行大
所以對row和col做binary search 的方法會不行
但單純就row和col本身來看,數值都還是sorted的
所以右上角往左往下,都會是遞減
或者左下角往上往右,都會是遞增
可以從這兩個地方出發來找值,這次選用右上角
如果 target 比目前的值大,到下移動
如果 target 比目前的小,往左移動
kotlin
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Solution { | |
fun searchMatrix(matrix: Array<IntArray>, target: Int): Boolean { | |
var row = 0 | |
var col = matrix[0].lastIndex | |
while(row < matrix.size && col > -1) { | |
when { | |
matrix[row][col] == target -> return true | |
matrix[row][col] < target -> ++row | |
else -> --col | |
} | |
} | |
return false | |
} | |
} |
沒有留言:
張貼留言