题目一:
剑指 Offer 04. 二维数组中的查找https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/
想法:按行二分法
代码:
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
for (int i = 0; i < matrix.length; i++) {
int j = help(matrix, i, target);
//如果第一个大于target的位置就是0,则代表此行后面的都大于target,即未找到
//因为到了下一行说明上一行也没找到
if (j==0){
return false;
}
//找到
if (matrix[i][j-1] == target)
return true;
}
//最终target大于所有值时,返回false
return false;
}
//找到第一个大于target的位置
int help(int[][] matrix, int i,int target) {
int head = 0;
int tail = matrix[0].length - 1;
while (head <= tail) {
int medium = (head + tail) / 2;
if (matrix[i][medium] <= target)
head = medium + 1;
else
tail = medium - 1;
}
return head;
}
}
结果:
题目二:
剑指 Offer 11. 旋转数组的最小数字https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/
想法:二分法
参考了作者:jyd
链接:https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/solution/mian-shi-ti-11-xuan-zhuan-shu-zu-de-zui-xiao-shu-3/
代码:
class Solution {
public int minArray(int[] numbers) {
int head = 0;
int tail = numbers.length - 1;
while (head < tail) {
int medium = (head + tail) / 2;
if (numbers[medium] > numbers[tail])
//若中点值大于尾点,则说明中点为左顺序组中,应在右侧查找
head = medium + 1;
else if (numbers[medium] < numbers[tail])
//若中点值小于尾点,则说明中点为右顺序组中,应在左侧查找
//注意中点可能就是最小值本身,所以tail=m即可,不必减一
tail = medium;
else
//若中点值等于尾点,则无法判断,但可以肯定出现了连续相同值
//则此时可直接寻找头尾间的最小值(不必全部遍历即可找到)
return findMin(numbers,head,tail);
}
return numbers[head];
}
public int findMin(int[] numbers,int start,int end){
int result = numbers[start];
for(int i = start;i <= end;i++){
if (numbers[i] < result) result = numbers[i];
}
return result;
}
}
结果:
题目三:
剑指 Offer 50. 第一个只出现一次的字符https://leetcode-cn.com/problems/di-yi-ge-zhi-chu-xian-yi-ci-de-zi-fu-lcof/
想法:hash表,很巧妙!
代码:
class Solution {
public char firstUniqChar(String s) {
HashMap<Character, Boolean> dic = new HashMap<>();
char[] sc = s.toCharArray();
for(char c : sc)
//若存在,则存入false;若不存在,则存入true
dic.put(c, !dic.containsKey(c));
for(char c : sc)
//只出现一次的字符,存值应为true
if(dic.get(c))
return c;
//若没有true,则无只出现一次的字符
return ' ';
}
}
结果: