zoukankan      html  css  js  c++  java
  • Leetcode刷题笔记

    找出数组中重复的数字。


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

    示例 1:

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

    限制:

    2 <= n <= 100000

    链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof

    思路:一开始我只想到用双循环嵌套的方式暴力搜索,结果超时不能通过。

    后来参考了一种解题思路:下标定位法

    从头到尾扫描数组,当扫描到下标为i的数字时,首先比较这个数字(用m表示)是否等于下标i,如果等于就扫描下一个数字;如果不是,则将它和第m个数字进行比较.
    如果它和第m个数相等,那么出现了重复直接返回;如果不相等,则将它和第m个数进行交换,把m放到第m个位置上
    重复这个过程,知道出现一个重复的数字
    时间复杂度O(n),空间复杂度O(1)

    我用C++实现如下:

     1 class Solution {
     2 public:
     3     int findRepeatNumber(vector<int>& nums) {
     4         int i,temp;
     5         int n = nums.size();
     6         for(i = 0; i < n; i++){
     7             while(nums[i] != i){
     8                 if(nums[i] == nums[nums[i]]){
     9                     return nums[i];
    10                 }
    11                 temp = nums[i]; 
    12                 nums[i] = nums[temp]; 
    13                 nums[temp] = temp;
    14                 
    15             }
    16         }
    17         return -1;
    18     }
    19 };

    其他两种思路:

    排序做法

    • 思路是将数组排好序,在查找重复数字,这个思路很简单
    • 时间复杂度O(nlogn),空间复杂度O(1)

    哈希表

    • 遍历整个数组,当这个数字没有出现过哈希表的时候将其加入进去,如果在哈希表中则直接返回即可
    • 时间复杂度O(n),空间复杂度O(n)
  • 相关阅读:
    潜水员
    混合背包
    多重背包问题
    归并排序——最省时的排序
    HDU 1556 Color the ball
    2016 ACM/ICPC Asia Regional Dalian Online Football Games
    poj 2352 Stars
    poj 2299 Ultra-QuickSort
    关于原码反码补码以及位元算
    2016 湖南省省赛 Problem A: 2016
  • 原文地址:https://www.cnblogs.com/Weems/p/12470463.html
Copyright © 2011-2022 走看看