力扣剑指offer 第4天 查找算法(简单) 03. 数组中重复的数字 LCOF && 53 - I. 在排序数组中查找数字 LCOF && 53 - II. 缺失的数字 LCOF

力扣剑指offer 第4天 查找算法(简单) 剑指 Offer 03. 数组中重复的数字 LCOF 剑指 Offer 53 - I. 在排序数组中查找数字 LCOF 剑指 Offer 53 - II. 缺失的数字 LCOF

剑指 Offer 03. 数组中重复的数字 LCOF

//这题可以用set简单判断是否已经有存在的值 提高效率可以用一个数组对应放置值如果冲突则输出即可
class Solution {
        public int findRepeatNumber(int[] nums) {
            Set<Integer> set = new HashSet<>();
            for (int num : nums) {
                Integer n = num;
                if(set.contains(n))return num;
                set.add(num);
            }
            return 0;//这个只是避免报错
        }
    }

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

题目

统计一个数字在排序[非递减]数组中出现的次数。

思路

  • 二分搜索效率超高![一开始就给m赋值(l+r)/2则最后可以直接使用m]
  1. 特判空数组 直接返回0
  2. 二分搜索 找到一个target所在的位置m
  3. nums[m]!=target(没找到)返回0
  4. nums[m]==target (n=1) 左右搜寻target 找到则n++
  5. 返回n

代码

class Solution {
        public int search(int[] nums, int target) {
            if(nums.length==0)return 0;//空数组特判
            int l = 0, r = nums.length - 1;
            int m = (l + r) >> 1;
            //2分查找找到target其中一个值所在位置
            while (l < r && nums[m] != target) {
                if (nums[m] > target) r = m;
                else l = m + 1;
                m = (l + r) >> 1;
            }
            //先判读该位置是不是target
            if (nums[m] != target) return 0;
            int n = 1;
            //左右寻找
            for (int i = m + 1; i < nums.length; i++)
                if (nums[i] == target) n++;
                else break;
            for (int i = m - 1; i >= 0; i--)
                if (nums[i] == target) n++;
                else break;
            return n;
        }
    }

剑指 Offer 53 - II. 缺失的数字 LCOF

题目

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

思路

二分搜索[m没有在初始化的时候赋予(l+r/2)则最后应该用r或l代表m]

如果nums[m]=m说明左边不缺右边缺 l=m+1

如果nums[m]!=n 说明左边缺r=m

如果最后nums[r]=r说明缺的是n(nums.length)否则缺的是r

代码

class Solution {
        public int missingNumber(int[] nums) {
            int l=0,r=nums.length-1,m=0;
            while (l<r){
                m = (l+r)>>1;
                if(nums[m]==m)l=m+1;
                else r=m;
            }
            if(nums[r]==r)return nums.length;
            return r;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值