剑指Offer-学习计划(七)查找算法(上)

题目一:

复制代码
 剑指 Offer 03. 数组中重复的数字
复制代码
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
https://leetcode.cn/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/

解法一:简单排个序遍历下做个对比

java 复制代码
public int findRepeatNumber(int[] nums) {
        Arrays.sort(nums);
        for (int i = 1; i < nums.length; i++) {
            if (nums[i]==nums[i-1])return nums[i];
        }
        return -1;
    }

解法二:用HashSet去重求解

java 复制代码
public int findRepeatNumber1(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for (int i = 0; i < nums.length; i++) {
            if (!set.add(nums[i]))return nums[i];
        }
        return 0;
    }

题目二:

剑指 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
https://leetcode.cn/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof/

解法一:最简单的遍历求解

java 复制代码
public int search(int[] nums, int target) {
        int count = 0;
        for (int num : nums) {
            if (num == target) count++;
        }
        return count;
    }

解法二: 面试的话还是得二分查找,加分解

java 复制代码
public int search2(int[] nums, int target) {
        return helper(nums,target)-helper(nums,target-1);
    }

    private int helper(int[] nums, int target) {
        int low = 0, high = nums.length-1;
        while (low <= high){
            int mid = low + ((high-low)>>1);
            if (nums[mid]<=target){
                low = mid + 1;
            }else {
                high = mid - 1;
            }
        }
        return low;
    }

题目三:

剑指 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
https://leetcode.cn/problems/que-shi-de-shu-zi-lcof/

解法一:暴力解法,直接遍历判断

java 复制代码
public int missingNumber(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            if (nums[i]!=i)return i;
        }
        return nums[nums.length-1]+1;
    }

解法二:二分查找套公式,用一下位运算可以当抖个机灵

java 复制代码
 public int missingNumber1(int[] nums) {
        int low = 0, high = nums.length-1;
        while (low<=high){
            int mid = low + ((high-low)>>1);
            if (nums[mid]==mid) low = mid + 1;
            else high = mid - 1;
        }
        return low;
    }

解法三:数据结构解法标答,用解法二和三都可以,让人知道你会用算法和结构解决问题

java 复制代码
 public int missingNumber2(int[] nums) {
        int len = nums.length;
        Set<Integer> set = Collections.synchronizedSet(new HashSet<>());
        for (int i : nums) {
            set.add(i);
        }
        for (int i=0;i<=len;i++){
            if (set.add(i)){
                return i;
            }
        }
        return 0;
    }
相关推荐
代码山河8 小时前
Python就业方向全解析:后端、爬虫、数据分析、AI你选哪个?
python·学习·架构·教程·面向对象·项目
释厄6239 小时前
AI学习层更新与跨体转移律——人类社会同构·不缺理解缺 U
人工智能·学习
UIU11410 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
论文复现现场11 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi11 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
秋天的怀念_David12 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
碧海银沙音频科技研究院13 小时前
在PC电脑上用Whisper→Marian算法实现离线语音翻译功能
算法·whisper
小嘉丶学长13 小时前
Day14 · 字典与集合
java·开发语言·网络·python·学习·1024程序员节
niyongsheng13 小时前
3D 装箱算法工程化:数据结构、放置启发式与支撑规则
数据结构·算法·rust
小李不想当小白13 小时前
SPI通信外设与W25Q64 (硬件SPI)(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式