zoukankan      html  css  js  c++  java
  • [Leetcode] Find the Duplicate Number, Solution

    Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), prove that at least one duplicate number must exist. Assume that there is only one duplicate number, find the duplicate one.
    Note:
    1. You must not modify the array (assume the array is read only).
    2. You must use only constant, O(1) extra space.
    3. Your runtime complexity should be less than O(n2).
    4. There is only one duplicate number in the array, but it could be repeated more than once.

    [Thoughts]
    这题想清楚了就不难,想不清楚就麻烦。

    假设数组A长度是n, 里面存储1到n的整数,那么很清楚,我们可以在按照A[i] = i+1,进行排序。但是现在有n+1个整数,而且至少有一个数字存在冗余。如果我们仍然按照A[i] = i+1来排序数组的话,那么当发现A[i]上已经是i+1的值时,说明我们已经找到了冗余数了。

    举个例子,


    简单的说,就是遍历数组的同时,按照A[i]应该放到A[A[i]]原则,进行swap,第一个无法swap的数字就是所求。


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

    github: https://github.com/codingtmd/leetcode/blob/master/src/Find_the_Duplicate_Number.cpp


  • 相关阅读:
    JDOM入门实例:读取与创建xml文档
    C++构造函数/析构函数/拷贝构造函数/深拷贝浅拷贝解析
    java类的访问权限
    hive怎样决定reducer个数
    hive Cli常用操作(翻译自Hive wiki)
    hive local hadoop特性
    hive数据操作(翻译自Hive wiki+实例讲解)
    hive的hive.exec.parallel参数说明
    hive数据类型(翻译自Hive Wiki)
    hive 创建/删除/截断 表(翻译自Hive wiki)
  • 原文地址:https://www.cnblogs.com/codingtmd/p/5078841.html
Copyright © 2011-2022 走看看