第五天——查找算法(中等)

剑指 Offer 04. 二维数组中的查找

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

public class Solution {
    public bool FindNumberIn2DArray(int[][] matrix, int target) {
        if(matrix.GetLength(0) == 0)
        {
            return false;
        }

        int row = 0;
        int column = matrix[0].Length - 1;

        while(row < matrix.GetLength(0) && column >= 0)
        {
            if(target == matrix[row][column])
            {
                return true;
            }
            else if(target > matrix[row][column])
            {
                row++;
            }
            else if(target < matrix[row][column])
            {
                column--;
            }
        }

        return false;
    }
}

特别注意:范例用的其实是交错数组,并不是二维数组

嘛看到递增有序数列首先就要想起二分法

但是这题是二维数组,能用到二分法的思路吗?

我二维数组做的不多

最后除了暴力还是想不到其他办法

老老实实滚去看题解了

执行的步骤大概是这样子的

第一种情况:数组是空的,那就直接返回空

第二种情况:数组不是空的

此时有两个下标分别代表行和列

行下标初始为0,列下标为列-1(二维数组的右上角)

从这个元素开始和目标值进行比较

  • 如果相等,直接返回true
  • 如果小于,那就往下找,行下标加1,也就是移到下面一行
  • 如果大于,就往左找,列下标减一

循环的判断条件就是边界 ,如果到了边界都没找到就说明这个元素不存在


剑指 Offer 11. 旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。

public class Solution {
    public int MinArray(int[] numbers) {
        
        for(int i=1;i<numbers.Length;i++)
        {
            if(numbers[i] < numbers[i-1])
            {
                return numbers[i];
            }
        }

        return numbers[0];
    }
}

思路很简单

但是我不是很能理解为啥1,3,5也是一个旋转数组

移动0个元素到数组后也算一个旋转数组吗

总之思路就是判断,因为递增一旦有一个元素比前面来的小

那这个元素一定是最小值

默认值就默认第一个元素(不改变所以最小值还是第一个)


 

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注