数据结构(day07)

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 ' ';
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值