每日N+1题 -- 算法练习 Day2

题目主要来源:LeetCode。主要选自剑指offer程序员面试宝典
每日尽可能保持 N+1 道题,N 取 0 到 9。

部分解法是从LeetCode上大佬们的解法中拿过来的,如有侵权,告知立删

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

/**
 * JZ04  从右上角往左下角搜索,直到下标越界
 *
 * @author Anjude
 * @date 2021/7/4 15:12
 */
public class JZ04 {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return false;
        }
        int row = matrix.length, col = matrix[0].length;
        // 开始时,右边已经是最大(col - 1),不需要再考虑右移
        int i = 0, j = col - 1;
        while (i < row && j >= 0) {
            if (matrix[i][j] > target) {
                // 当前值过大,往左移动
                j--;
            } else if (matrix[i][j] < target) {
                // 当前值过小,往下移动
                i++;
            } else {
                return true;
            }
        }
        return false;
    }
}

0x02 剑指 Offer 10- II. 青蛙跳台阶问题

/**
 * JZ10  斐波那契数列,题目规定 n = 0,需返回 1
 *
 * @author Anjude
 * @date 2021/7/4 15:40
 */
public class JZ10 {
    public int numWays(int n) {
        if(n < 2) return 1;
        int a = 1, b = 1, sum = 0;
        for (int i = 0; i < n; i++) {
            sum = (a + b) % 1000000007;
            a = b;
            b = sum;
        }
        return a;
    }
}

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

/**
 * JZ11  二分查找
 *
 * @author Anjude
 * @date 2021/7/4 15:49
 */
public class JZ11 {
    public int minArray(int[] numbers) {
        int low = 0;
        int high = numbers.length - 1;
        while (low < high) {
            int pivot = low + (high - low) / 2;
            // 如果中间下标小于最高下标的数,说明最小值不在pivot~high的下标范围内
            if (numbers[pivot] < numbers[high]) {
                high = pivot;
            } else if (numbers[pivot] > numbers[high]) {
                low = pivot + 1;
            } else {
                // 当 numbers[pivot] == numbers[high]时,说明有重复值,丢弃右边数据
                high -= 1;
            }
        }
        return numbers[low];
    }

    public static void main(String[] args) {
        JZ11 jz11 = new JZ11();
        jz11.minArray(new int[]{3,1});
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值