二维数组查找优化:定位基准值的改进算法

需积分: 1 0 下载量 178 浏览量 更新于2024-07-09 收藏 1.45MB DOCX 举报
"剑指offer(幸运篇)文档分享中,涉及一道关于二维数组查找的面试题。题目要求设计一个函数,在一个已按行递增、列递增排序的二维数组中寻找是否存在特定整数。解决者初步尝试通过定义二维数组,并以数组右下角的元素作为基准值进行比较,但实际上应从左下角和右上角的边界开始搜索。 思路解析: 1. 题目描述中的二维数组已经确保每行和每列都是有序的,这意味着我们可以通过双指针法来寻找目标整数。初始化两个指针,`i` 从最后一行开始(即 `m-1`)向下,`j` 从最后一列开始(即 `n-1`)向右移动。同时,设置一个标志值 `flag`,用于记录是否找到目标值。 2. 比较当前指针位置的元素 `array[i][j]` 和目标值 `num`。如果 `array[i][j]` 大于 `num`,说明我们要查找的数可能在左下方,因此将 `j` 减一;如果 `array[i][j]` 小于或等于 `num`,说明我们可能在当前范围内找到了目标,将 `i` 减一,同时更新 `flag` 为 `true`。 3. 在遍历过程中,如果 `i` 或 `j` 落出数组范围(即 `i < 0` 或 `j < 0`),说明没有在数组中找到目标值,此时 `flag` 仍然为 `false`,则返回 `flag`。如果 `flag` 为 `true`,表示在数组中找到了目标值,函数返回 `true`。 4. 提供的代码中存在错误,主要在于错误地将 `first` 初始化为右下角的值,实际上应该初始化为 `array[0][0]`。修复后的代码会从左下角开始,逐步向右上方移动,直到找到目标值或者遍历完整个数组。 代码优化建议: ```java import java.util.Scanner; public class Solution1 { public static boolean findNumber(int[][] array, int num) { // 录入数组信息 Scanner scanner = new Scanner(System.in); int m = scanner.nextInt(); int n = scanner.nextInt(); int[][] arrayCopy = new int[m][n]; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { arrayCopy[i][j] = array[i][j]; // 创建副本以避免直接修改原数组 } } // 记录起步值 int first = arrayCopy[0][0]; // 双指针遍历 int i = 0, j = 0; while (i < m && j < n) { if (arrayCopy[i][j] > num) { j--; } else if (arrayCopy[i][j] <= num) { i++; if (arrayCopy[i][j] == num) { return true; } } } return false; } public static void main(String[] args) { // ...其他输入和调用findNumber方法的逻辑... } } ``` 以上是解决这个问题的关键知识点,希望对你学习二维数组查找算法有所帮助。"