zoukankan      html  css  js  c++  java
  • leetcode 287

    287. Find the Duplicate Number

    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.

    Example 1:

    Input: [1,3,4,2,2]
    Output: 2
    

    Example 2:

    Input: [3,1,3,4,2]
    Output: 3

    观察序列可知,数组的最大的index肯定大于数组内的数,例如第一个例子中,index最大为4,而数组内最大数为4,则num[num[index]]肯定在数组内循环;

    所以有1-3-2-【4-2】其中42构成环;用快慢指针可以解环的问题。

    O(1)空间,O(n)时间

    int findDuplicate3(vector<int>& nums)
    {
        if (nums.size() > 1)
        {
            int slow = nums[0];
            int fast = nums[nums[0]];
            while (slow != fast)
            {
                slow = nums[slow];
                fast = nums[nums[fast]];
            }
    
            fast = 0;
            while (fast != slow)
            {
                fast = nums[fast];
                slow = nums[slow];
            }
            return slow;
        }
        return -1;
    }
    //取该数组的中间值mid,如果遍历数组发现所有大于mid的个数比mid大,证明重复的数字在右半区间,否则在左区间;以此类推。
    //O(1)空间,O(nlogn)时间
    calss Solution{
    int findDuplicate(vector<int>& nums) { int n=nums.size()-1; int low=1; int high=n; int mid; while(low<high){ mid=(low+high)/2; int count=0; for(int num:nums){ if(num<=mid) count++; } if(count>mid) high=mid; else low=mid+1; } return low; } }

    238. Product of Array Except Self

    Given an array nums of n integers where n > 1,  return an array output such that output[i] is equal to the product of all the elements of nums except nums[i].

    Example:

    Input:  [1,2,3,4]
    Output: [24,12,8,6]
    

    Note: Please solve it without division and in O(n).不能使用除法和时间度O(n)

    class Solution {
    vector<int> productExceptSelf(vector<int> nums) {
        int n = nums.size();
        vector<int> res(n,1);
       
        for (int i = 1; i < n; i++) {
            res[i] = res[i - 1] * nums[i - 1]; //res数组从index=1开始保存nums[i-1]前所有数的乘积,即除了当前数的外前面的数的乘积
        }
        int right = 1;
        for (int i = n - 1; i >= 0; i--) {
            res[i] *= right;
            right *= nums[i];    ///重复上面的过程,不过这次是从nums右边开始乘积;综合两次的乘积就能得出除了当前位置的左边乘积呈上右边乘积的res
        }
        return res;
    }

    //举个例子
    nums = 1, 2, 3, 4
    res = 1, 1, 2, 6 //红的2是nums的1*2,从左到右
    right = 24,12, 4, 1 //蓝的12是nums的3*4,从右到左
    res = 24,12, 8, 6 //上面的两者叠乘就等于目标结果,即除去当前的值其他所有值的乘积
  • 相关阅读:
    WebForm中使用MVC
    CPAN镜像使用帮助
    关于XML文档的xmlns、xmlns:xsi和xsi:schemaLocation
    XML之命名空间的作用(xmlns)
    xml相关术语说明
    .NET Core系列 : 1、.NET Core 环境搭建和命令行CLI入门
    BZOJ3734 : [Ontak2013]Miny
    BZOJ3448 : [Usaco2014 Feb]Auto-complete
    BZOJ3476 : [Usaco2014 Mar]The Lazy Cow
    BZOJ3619 : [Zjoi2014]璀灿光华
  • 原文地址:https://www.cnblogs.com/hotsnow/p/9940431.html
Copyright © 2011-2022 走看看