leetcode(4) 10.11-10.12

这篇博客探讨了如何在排序数组中查找特定数字出现的次数,使用了两种不同的方法,包括for循环和二分查找。同时,介绍了如何在有序数组中找到缺失的数字。这些题目涉及到数组处理和搜索算法,对于算法理解与优化具有实践价值。
摘要由CSDN通过智能技术生成

剑指offer 53 - I. 在排序数组中查找数字I

统计一个数字在排序数组中出现的次数。

示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0

方法一:for循环判断数字出现的个数,如果重复出现,次数自增即可。
class Solution {
    public int search(int[] nums, int target) {
        //循环判断
        int res = 0;
        for(int i = 0; i < nums.length; i++ ){
            if( nums[i] == target ){
                res++;
            }else if( nums[i] > target){
                break;
            }
        }
        return res;
    }
}
方法二:二分查找,使用两次二分查找。第一次判断目标值第一次出现的位置,第二次判断目标值最后一次出现的位置。次数=尾-头+1
class Solution {
    public int search(int[] nums, int target) {
        if( nums.length == 0 ) return 0;
        int l = 0, r = nums.length - 1; 
        //判断目标值右边界
        while( l <= r){
            int mid = l + (r - l) / 2;
            if( nums[mid] <= target ){
                l = mid + 1 ;
            }else{
                r = mid - 1;
            }
        }
        if( r >= 0 && nums[r] != target  ) return 0;
        int e = r ;
        //判断目标值左边界
        l = 0; 
        r = nums.length - 1;
        while( l <= r){
            int mid = l + (r - l) / 2;
            if( nums[mid] >= target ){
                r = mid - 1;
            }else{
                l = mid + 1;
            }
        }
        int b = l ; 
        return e - b + 1 ;
    }
}

简化代码版本

class Solution {
    public int search(int[] nums, int target) {
        return binarySearch(nums,target) - binarySearch(nums,target - 1);
    }
    public int binarySearch(int[] nums , int tar){
        int l = 0, r = nums.length - 1;
        while( l <= r ){
            int mid = l + ( r - l ) / 2;
            if( nums[mid] <= tar) l = mid +1;
            else r = mid -1 ; 
        }
        return l;
    }
}

剑指 Offer 53 - II. 0~n-1中缺失的数字

一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。

示例 1:
输入: [0,1,3]
输出: 2
示例 2:
输入: [0,1,2,3,4,5,6,7,9]
输出: 8

方法:循环
class Solution {
    public int missingNumber(int[] nums) { 
        if( nums[0] == 1 ) return 0;
        for( int i = 0; i < nums.length ; i++){
            if( nums[i] != i ){ 
                  return nums[i] - 1 ;
            } 
        } 
        return nums.length;
    }
}

10.12 剑指 Offer 50. 第一个只出现一次的字符

在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。

示例 1:
输入:s = “abaccdeff”
输出:‘b’
示例 2:
输入:s = “”
输出:’ ’

方法:利用额外数组空间实现,遍历两遍,第一次统计每个字符出现的次数,第二次找出第一次只出现一次的字符。
class Solution {
    public char firstUniqChar(String s) {
        int[] a = new int[26];
        char[] sc = s.toCharArray();
        for(char ch : sc){
            a[ ch - 'a' ]++;
        }
        for(char c : sc){
            if( a[ c - 'a' ] == 1){
                return c;
            }
        }
        return ' ';
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值