Google算法题:M-Find the Duplicate Number
2017-08-20 19:26
411 查看
http://www.lintcode.com/zh-cn/problem/find-the-duplicate-number/
http://www.jiuzhang.com/article/Google%202016%E5%B9%B412%E6%9C%88New%20Grad%20SDE%E7%94%B5%E9%9D%A2%E9%9D%A2%E7%BB%8F/
Given an array
prove that at least one duplicate number must exist. Assume that there is only one duplicate number, find the duplicate one.
注意事项
You must not modify the array (assume the array is read only).
You must use only constant, O(1) extra space.
Your runtime complexity should be less than O(n^2).
There is only one duplicate number in the array, but it could be repeated more than once.
您在真实的面试中是否遇到过这个题?
Yes
样例
Given
Given
public class Solution {
/**
* @param nums an array containing n + 1 integers which is between 1 and n
* @return the duplicate one
*/
//TC=O(nlgn)
public int findDuplicate(int[] nums) {
// Write your code here
if(nums==null || nums.length==0) return -1;
int n = nums.length;
int s=1, e=n-1;
while(s<=e){
int m = (s+e)/2;
int lowerCount=0, higerCount=0, euqalCount=0;
for(int i=0; i<n; i++){
if(m==nums[i]){
euqalCount++;
if(euqalCount>1)
return m;
}else if(m<nums[i]){
higerCount++;//比m大的数的计数
}else{
lowerCount++;//比m小的数的计数
}
}
if(higerCount>(n-1-m))//由于是n+1个数,多出的一个可定是重复的数
s=m+1;
else if(lowerCount>(m-1))
e=m-1;
}
return -1;
}
}
http://www.jiuzhang.com/article/Google%202016%E5%B9%B412%E6%9C%88New%20Grad%20SDE%E7%94%B5%E9%9D%A2%E9%9D%A2%E7%BB%8F/
Given an array
numscontaining
n + 1integers where each integer is between
1and
n(inclusive),
prove that at least one duplicate number must exist. Assume that there is only one duplicate number, find the duplicate one.
注意事项
You must not modify the array (assume the array is read only).
You must use only constant, O(1) extra space.
Your runtime complexity should be less than O(n^2).
There is only one duplicate number in the array, but it could be repeated more than once.
您在真实的面试中是否遇到过这个题?
Yes
样例
Given
nums=
[5,5,4,3,2,1]return
5
Given
nums=
[5,4,4,3,2,1]return
4
public class Solution {
/**
* @param nums an array containing n + 1 integers which is between 1 and n
* @return the duplicate one
*/
//TC=O(nlgn)
public int findDuplicate(int[] nums) {
// Write your code here
if(nums==null || nums.length==0) return -1;
int n = nums.length;
int s=1, e=n-1;
while(s<=e){
int m = (s+e)/2;
int lowerCount=0, higerCount=0, euqalCount=0;
for(int i=0; i<n; i++){
if(m==nums[i]){
euqalCount++;
if(euqalCount>1)
return m;
}else if(m<nums[i]){
higerCount++;//比m大的数的计数
}else{
lowerCount++;//比m小的数的计数
}
}
if(higerCount>(n-1-m))//由于是n+1个数,多出的一个可定是重复的数
s=m+1;
else if(lowerCount>(m-1))
e=m-1;
}
return -1;
}
}
相关文章推荐
- 算法(9)Find the Duplicate Number
- 算法题——Find the Duplicate Number(JAVA)
- leetcode Find the Duplicate Number
- Google Treasure Hunt 2008---Find the Smallest Prime Number
- Find the Duplicate Number
- [leetcode] Find the Duplicate Number
- [leetcode 287]Find the Duplicate Number
- Find the Duplicate Number
- [leetcode287] Find the Duplicate Number
- Leetcode (287) Find the Duplicate Number
- [LeetCode][JavaScript]Find the Duplicate Number
- leetcode_c++:Find the Duplicate Number(287)
- Google Treasure Hunt 2008---Find the Smallest Prime Number
- leetcode287 Find the Duplicate Number
- 287. Find the Duplicate Number
- Find the Duplicate Number
- 287. Find the Duplicate Number
- Find the Duplicate Number
- leetcode之Find the Duplicate Number
- leetcode之Find the Duplicate Number