第 5 天 查找算法(中等):剑指offer04、11、50

本文探讨了两种算法问题的解决方案:在二维矩阵中查找目标元素,以及在旋转数组中寻找最小数字。对于二维查找,从中间位置开始,根据目标值与当前值的比较调整搜索方向。而在旋转数组中,利用二分法结合数组旋转特性找到最小值。此外,还提出了在字符串中找到首次出现一次的字符的策略,通过Map记录字符及其位置来实现。
摘要由CSDN通过智能技术生成

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

在这里插入图片描述

大佬思路
  1. 用Boolean当作value,这样遍历直接返回true的第一个即可(但是我以为hashmap是无序的,加入顺序不等于剔出顺序,唉);
  2. 用出现次数当作value;
  3. 直接用Set
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值