当前位置: 首页 > news >正文

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


文章目录

  • 题目
  • 思路
  • 代码和注释
  • 总结


题目

找出数组中重复的数字。

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

我的思考欠缺:考察点,要考虑到到底是时间优先还是空间优先
1、直接使用hashmap做一个字典,进行迭代匹配
2、排序后使用双指针进行遍历比较
3、如果面试官要求空间O(1)并且不能修改原数组,还得写成二分法!!!

代码和注释

方法一、使用了hsah通过字典的方式完成

 // 1、考虑时间优先,使用hash表完成字典匹配
 
    public int findRepeatNumber(int[] nums) {
        Map<Integer,Integer> map = new HashMap<>();
        for(int num : nums){
            if(!map.containsKey(num)){
                map.put(num,num);
            }else{
                return num;
            }
        }
        return -1;
    }

方法二:使用双指针(同时满足了时间和空间的要求,但是还是对原来的数组进行了改变

 // 先排序,使用双指针
    public int findRepeatNumber(int[] nums) {
        Arrays.sort(nums);
        int next = 1;
        for(int i = 0; i < nums.length; i++){
            if(nums[i] == nums[next]){
                return nums[i];
            }
            // 后移
            next++;
        }
        return -1;
    }

方法三:使用二分法

总结

来自leetcode热评===>
这道题在原书上绝对不是简单级别啊!
它考察的是程序员的沟通能力,先问面试官要时间/空间需求!!!
只是时间优先就用字典,
还有空间要求,就用指针+原地排序数组,
如果面试官要求空间O(1)并且不能修改原数组,还得写成二分法!!!

相关文章:

  • 5_会话管理实现登录功能
  • 【STL】STL入门(9)
  • 超市积分管理系统(Java+Web+MySQL)
  • 超级简单的机器学习入门
  • 基于SSM跨境电商网站的设计与实现/海外购物平台的设计
  • Flutter——常用布局
  • RBF神经网络python实践学习(BP算法)
  • _Linux 动态库
  • spring5(一):概述
  • C++基础知识梳理<2>(引用、内联函数、auto关键字) [入门级】
  • Halcon图像分割总结
  • 学习笔记-WinRM
  • Java内存模型与volatile
  • LIO-SAM中的mapOptmization
  • Pandas数据处理可视化
  • NA of optical fiber(光纤的数值孔径)
  • 花了整整一天,总结了C语言所有常用的文件操作
  • 2022 年十大 Python Web 开发框架
  • Go语言学习(五)-- 函数和闭包
  • 【数据结构】链表其实并不难 —— 手把手带你实现单链表