zoukankan      html  css  js  c++  java
  • 剑指offer-03-数组中重复的数字

    题目描述

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

    我的解法

    排序

    先排序,在找
    性能不好

    数组记录

    用数据记录出现的次数
    空间换时间

    public int findRepeatNumber(int[] nums) {
            byte arr[] = new byte[nums.length];
            for(int n: nums){
                if(arr[n]==1)return n;
                arr[n]=0b1;
            }
            return -1;
    }
    

    时间击败90%
    时间复杂度:O(N)
    空间复杂度:O(N)

    其他解法

    这个方法很精妙
    若没有重复,排序后元素nums[i]出现在的第i个
    现在有重复,且没有排序,
    遍历,判断num[i]是不是第i个,不是则交换,同时在途中判断是否有重复

    public int findRepeatNumber(int[] nums) {
            int temp;
            for(int i=0;i<nums.length;i++){
                while (nums[i]!=i){
                    if(nums[i]==nums[nums[i]]){
                        return nums[i];
                    }
                    temp=nums[i];
                    nums[i]=nums[temp];
                    nums[temp]=temp;
                }
            }
            return -1;
    }
    

    算法是很巧妙
    随着遍历进行,数组越来越有序,直到碰到第一个重复的数
    性能很好,击败100%
    时间复杂度O(N)
    空间复杂度O(1)

    其他还有些解法,什么HashMap,感觉都没什么特色,想要时间换空间,使用数组比map更直接。

  • 相关阅读:
    do-while-zero 结构在宏定义中的应用
    关于运放的几个概念
    Spring MVC 学习第一篇
    1229递归下降
    有限自动机的构造与识别
    11.11评论
    文法分析2
    文法分析
    201406114215+林志杰+文法分析
    词法分析实验总结
  • 原文地址:https://www.cnblogs.com/XT-xutao/p/12799513.html
Copyright © 2011-2022 走看看