题目
力扣-剑指 Offer 04. 二维数组中的查找
我的复述:
有一个二维数组
它满足从左往右,从上到下递增的规律,也就是说越接近左上角的数字越小,越接近右下角的数字就越大,现在我们要实现一个高效的算法(函数),查找这个二维数组中是否存在某个值,存在就返回true
,不存在返回false
。
题解
暴力法
先用一个循环,每次遍历出一个数组nums
,然后用sort.SearchInts查出nums
数组中target
的下标,接着做下判断即可。
1 2 3 4 5 6 7 8 9 10 11 12
| func findNumberIn2DArray(matrix [][]int, target int) bool { for _, nums := range matrix { i := sort.SearchInts(nums, target) if i < len(nums) && target == nums[i] { return true } } return false }
|
leetcode-cn执行:
1 2 3
| 执行用时: 28 ms, 在所有 Go 提交中击败了80.58%的用户 内存消耗:6.6 MB, 在所有 Go 提交中击败了70.78%的用户
|
牛客网运行:
1 2 3 4
| 运行时间:7ms 超过8.42%用Go提交的代码 占用内存:3204KB 超过44.21%用Go提交的代码
|
双指针
举例,查找数字8:
先让指针i
和j
都集中在左下角18的位置上,当发现18>8
,那就说明18这一整行都大于8,因此将指针i
向上移动一个位置;
当发现10>8
,那就说明10这一整行都大于8,因此将指针i
向上移动一个位置;
当发现3<8
,那就说明从数字3往上这一列,都比目标值8要小,因此将指针j
向右移动一个位置;
当发现6<8
,说明从数字6往上这一列,都比目标值8要小,因此将指针j
向右移动一个位置;
当发现9>8
,说明数字9向右边一整行的数字都大于8,因此将指针i
向上移动一个位置;
当发现8=8
,说明目标值8是存在的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { int i = matrix.length - 1; int j = 0; while(i >= 0 && j < matrix[0].length) { if (matrix[i][j] > target) { i--; } else if (matrix[i][j] < target) { j++; } else { return true; } } return false; } }
|
leetcode-cn
执行用时
1 2
| 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户 内存消耗:47.3 MB, 在所有 Java 提交中击败了31.35%的用户
|