题目主要来源:LeetCode。主要选自剑指offer、程序员面试宝典。
每日尽可能保持 N+1 道题,N 取 0 到 9。部分解法是从LeetCode上大佬们的解法中拿过来的,如有侵权,告知立删
文章目录
- 0x01 [剑指 Offer 04. 二维数组中的查找](https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/)
- 0x02 [剑指 Offer 10- II. 青蛙跳台阶问题](https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/)
- 0x03 [剑指 Offer 11. 旋转数组的最小数字](https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/)
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});
}
}