• 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 };

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

    心之所愿,永不相忘
  • 相关阅读:
    抓包整理外篇——————https 抓包 [ 五]
    HDFS核心原理
    MapReduce入门实战
    照着这个保姆级文档来,虚拟机装CentOS不再踩坑
    Hadoop基础入门
    Neo4j应用
    Neo4j基础入门
    MapReduce核心原理
    HDFS基础入门
    MongoDB应用实战
  • 原文地址:https://www.cnblogs.com/zgll/p/15760133.html
Copyright © 2020-2023  润新知