zoukankan      html  css  js  c++  java
  • n个数字,范围为[0,n1],求重复数字

    时间复杂度O(n),空间复杂度O(1)

    思路:把数字v放到索引为v的位置上去。但如果位置v上的数字本身就是v时,说明数字v重复了。

     1 class Solution {
     2 public:
     3     /**
     4      * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     5      *
     6      * 
     7      * @param numbers int整型vector 
     8      * @return int整型
     9      */
    10     void swaps(vector<int>& data, int x, int y) {
    11         int tmp = data[x];
    12         data[x] = data[y];
    13         data[y] = tmp;
    14     }
    15     
    16     int duplicate(vector<int>& number) {
    17         // write code here
    18         int i = 0;
    19         while (i < number.size()) {
    20             if (number[i] == i) ++i;  // 如位置0上的元素是0
    21             else if (number[i] == number[number[i]]) return number[i];
    22             else swaps(number, number[i], i);   // 这里只交换,不做i=number[i]操作
    23         }
    24         return -1;
    25     }
    26 };

     听虾皮的面试官说还可以通过位偏移的方法找,但目前我没思路。

    心之所愿,永不相忘
  • 相关阅读:
    codeforces 57C 思维
    FOJ 2232 匈牙利算法找二分图最大匹配
    UVA 101 vector
    POJ 3070 矩阵mob
    codeforces 60B bfs
    codeforces 54A
    codeforces 466C 计数 codeforces 483B 二分 容斥
    FOJ 2213 简单几何
    CCF-最优配餐(BFS)
    杂论-FTP
  • 原文地址:https://www.cnblogs.com/zgll/p/15760133.html
Copyright © 2011-2022 走看看