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更直接。

  • 相关阅读:
    伪类和伪元素的区别, 总结的很好, 直接看结论.
    进制闲谈
    遇到的问题&思考
    PHP中include引用导致不能再次相对引用文件的一个小问题
    ECharts饼图试玩
    不该迷茫的时候迷茫
    [5]火车票接口整理
    [4]xlongwei工具类
    [3]天行新闻
    [2]新闻
  • 原文地址:https://www.cnblogs.com/XT-xutao/p/12799513.html
Copyright © 2011-2022 走看看