1.查找算法
2.剑指offer04:二维数组中的查找
1.题目描述
2.题目解析
首先观察矩阵规律:从左至右、从上至下依次递增,所以我们可以从中间大小的位置找起,比如左下角或者右上角,小了则向右找或向下找,大了则向上找或向左找。
伪代码:
定位左下角:
(二维矩阵大小-1为第一个索引,0为第二个索引)
开始查找:
大于target:往上;
小于target:往右;
等于则找到;
直至到达最上方或最右方;查找失败。
代码如下:
public boolean findNumberIn2DArray(int[][] matrix, int target) {
int i=matrix.length-1,j=0;
while(i>=0&&j<matrix[0].length)
{
if(matrix[i][j]>target){
i--;
}
else if(matrix[i][j]<target)
{
j++;
}
else
return true;
}
return false;
}
3.剑指offer11:旋转数组的最小数字
1.题目描述
2.题目解析
又是顺序数组查找,首先二分法;但是这里的数组有一个旋转,则我们需要找到旋转点,也就是题目要求的最小的数字。
那怎么找:我们考虑到旋转点前面都是比它大的,后面也是比它大的,且前面的数大于等于后面的,中点与最后一个点比较;中点大则旋转点在后半段,中点小则旋转点在前半段,中点等于最后一个点,无法确定旋转点位置,但是最后一个点肯定能用中点代替,所以最后一点去掉再进行比较。
代码如下:
public int minArray(int[] numbers) {
int start=0;
int end=numbers.length-1;
while(start<=end)
{
int mid=(start+end)/2;
if(numbers[mid]>numbers[end])
{
start=mid+1;
}
else if(numbers[mid]<numbers[end])
{
end=mid;
}
else
end--;
}
return numbers[start];
}
4.剑指offer50:第一次只出现一次的字符
1.题目描述
2.题目解析
我的思路
查找第一次只出现一次的,肯定要查找出现过的,查找出现过的,用Map很快速,所以我遍历字符串,遇到一个字符先看是否在map中,不在则加入,同时加上它的位置,若在则将它的位置置为字符串长度,最后在查找第一次出现一次的,遍历map,找到最小的value(初值为字符串长度,这样那些重复的可以直接刨除),返回对应的key即可。
public char firstUniqChar(String s) {
if(s.equals(""))
return ' ';
Map<Character,Integer> map=new HashMap<>();
for(int i=0;i<s.length();i++)
{
if(map.containsKey(s.charAt(i)))
{
map.put(s.charAt(i),s.length());
}
else
{
map.put(s.charAt(i),i);
}
}
int min=s.length();
char res=' ';
for(char key:map.keySet())
{
int tmp=map.get(key);
if(min>tmp)
{
min=tmp;
res=key;
}
}
return res;
}
大佬思路
- 用Boolean当作value,这样遍历直接返回true的第一个即可(但是我以为hashmap是无序的,加入顺序不等于剔出顺序,唉);
- 用出现次数当作value;
- 直接用Set