第五天——查找算法
第一题——剑指 Offer 04. 二维数组中的查找
问题描述
思路
从右上角来寻找,如果大于目标值则向下移动,小于则向左移动。
代码
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
int left = 0;
if(matrix.length == 0) return false;
if(matrix[0].length == 0) return false;
int right = matrix[0].length-1;
while(right >= 0 && left < matrix.length){
if(matrix[left][right] > target){
right--;
}
else if(matrix[left][right] < target){
left++;
}
else return true;
}
return false;
}
}
第二题——剑指 Offer 11. 旋转数组的最小数字
问题描述
思路
利用二分法查找,提高效率。
还有一种简单粗暴解法,就是排好序,然后直接返回最小值。
代码
class Solution {
public int minArray(int[] numbers) {
int left=0 , right=numbers.length-1;
while(left<right){
int mid = (left+right)/2;
if(numbers[mid] > numbers[right]){
left=mid+1;
}
else if(numbers[mid] < numbers[right]){
right=mid;
}
else right--;
}
return numbers[left];
}
}
代码二
class Solution {
public int minArray(int[] numbers) {
Arrays.sort(numbers);
return numbers[0];
}
}
第三题
问题描述
思路
利用函数(第一次出现后最后一次出现)直接找出只存在一次的字符,输出当前字符
代码
class Solution {
public char firstUniqChar(String s) {
char[] Char = s.toCharArray();
for(int i=0;i<s.length();i++){
if(s.indexOf(Char [i]) == s.lastIndexOf(Char [i])){
return Char [i];
}
}
return ' ';
}
}
疑难点
indexOf()
indexOf() 方法有以下四种形式:
public int indexOf(int ch): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
public int indexOf(int ch, int fromIndex): 返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
int indexOf(String str): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
int indexOf(String str, int fromIndex): 返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
lastIndexOf()
public int lastIndexOf(int ch): 返回指定字符在此字符串中最后一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
public int lastIndexOf(int ch, int fromIndex): 返回指定字符在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索,如果此字符串中没有这样的字符,则返回 -1。
public int lastIndexOf(String str): 返回指定子字符串在此字符串中最右边出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
public int lastIndexOf(String str, int fromIndex): 返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索,如果此字符串中没有这样的字符,则返回 -1。
代码二
class Solution {
public char firstUniqChar(String s) {
int index = Integer.MAX_VALUE;
char ans = ' ';
for (char ch = 'a'; ch <= 'z'; ch++) {
int st = s.indexOf(ch);
if (st != -1 && st == s.lastIndexOf(ch)) {
if (index > st) {
index = st;
ans = ch;
}
}
}
return ans;
}
}