LeetCode Find the Duplicate Number 找重复出现的数(技巧)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode Find the Duplicate Number 找重复出现的数(技巧)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
?
題意:
有一個含有n+1個元素的數組,元素值是在1~n之間的整數,請找出其中出現超過1次的數。(保證僅有1個出現次數是超過1的數)
?
?
思路:
方法一:O(nlogn)。根據鴿籠原理及題意,每次如果<=k的數超過了k個,那么答案必定在[1,k]??梢杂枚置杜e答案來解決。
1 bool left(vector<int>& nums,int tar)//是否在左邊 2 { 3 int cnt=0; 4 for(int i=0; i<nums.size(); i++) 5 if(nums[i]<=tar) 6 cnt++; 7 return cnt>tar; 8 } 9 10 int findDuplicate(vector<int>& nums) 11 { 12 int L=1, R=nums.size()-1; 13 while(L<R) 14 { 15 int mid=R-(R-L+1)/2; 16 if( left(nums,mid)==true ) R=mid; 17 else L=mid+1; 18 } 19 return R; 20 } AC代碼?
?
方法二:O(n)。將數組nums看成是一個鏈表,next[i]表示點i的后繼(0也是一個點,因為0也是下標)。根據題意,此鏈表必定有且僅有一個簡單環存在,這樣就類似于Linked List Cycle II?,只是會多余出部分的鏈,但是這不會影響到這個模型,從0點出發依然存在這樣的一個模型,只是環的接口處不會是0而已。要注意兩個指針的起始位置,必須保證fast=2*slow。
1 class Solution { 2 public: 3 int findDuplicate(vector<int>& nums) 4 { 5 int slow=0, fast=nums[0]; 6 while(fast!=slow) 7 { 8 slow=nums[slow]; 9 fast=nums[nums[fast]]; 10 } 11 fast=0; 12 slow=nums[slow]; 13 while(fast!=slow) 14 { 15 slow=nums[slow]; 16 fast=nums[fast]; 17 } 18 return fast; 19 } 20 }; AC代碼?
轉載于:https://www.cnblogs.com/xcw0754/p/4924298.html
總結
以上是生活随笔為你收集整理的LeetCode Find the Duplicate Number 找重复出现的数(技巧)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Navicat导出表结构
- 下一篇: jQuery表单对象属性过滤选择器