1、剑指 Offer 11. 旋转数组的最小数字
思路分析
首先我们要知道 1.这个数组未旋转前是一个升序排列的数组
2.只旋转了一次
这样我们就可以讲数组分为两个部分 旋转的部分 和未旋转的部分
旋转的部分--旋转到数组的末尾 题目要求我们找到最小的数字,这个数字就应该包含在旋转的部分 因此我们只需要中间值给末尾值进行比较即可
我们可以通过二分查找进行查找
就会出现三种情况
这里我们设 i=0; j=数组长度-1 mid为 (i+j)/2 数组为arr
1.arr[mid] <arr[j]
代表mid一定是在旋转的部分中
因为是递增的 因此这个旋转点一定在[0,mid]之间 因此 让j=mid
2.arr[mid] >arr[j]
mid一定在未旋转的部分中
因此这个旋转点一定在[mid+1,j]之间 因此 让i=mid+1
3.arr[mid]==arr[j]
这种情况因为数组是可以有重复的数字的因此无法判断旋转点是在左还是右
因此我们只需要缩小范围接口 即j--
重复上面的动作直到i<j不成立的时候 就代表找到了
直接输出arr[i]
代码
class Solution {
public int minArray(int[] numbers) {
int i=0;
int j=numbers.length-1;
while(i<j){
//因为数组是递增的性质
int mid=(i+j)/2;
if(numbers[mid]<numbers[j]){
//因为递增的性质
//如果中间节点小于最后的节点 --代表旋转点一定在【0,mid】之间
j=mid;
}
else if(numbers[mid]>numbers[j]){
//如果是大于的话 代表旋转带你一定在【mid+1,j】
i=mid+1;
}else{
//等于是不一定的 因此我们j--缩小范围
j--;
}
}
return numbers[i];
}
}
2.剑指 Offer 50. 第一个只出现一次的字符
思路
这种要查找第一次出现的字符,我们就应该想到使用哈希表
我们可以使用map来进行存储 key为char value为boolean
如果重复就将boolean 变为false
又因为map是无序的 因此我们要使用char数组进行遍历
如果返回是真 就直接返回
如果循环结束还没有返回 就代表为空 直接返回 ' '
代码
class Solution {
public char firstUniqChar(String s) {
Map<Character,Boolean> map=new HashMap<>();
char[] c=s.toCharArray();
for(char ch:c){
map.put(ch,!map.containsKey(ch));
}
for(char ch:c){
if(map.get(ch)) return ch;
}
return ' ';
}
}