|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- 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
- Note:
- 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(n2).
- There is only one duplicate number in the array, but it could be repeated more than once.
复制代码
1.暴力解法
- class Solution {
- public int findDuplicate(int[] nums) {
- if(nums.length == 0) return 0;
-
-
- for(int i = 0; i< nums.length-1; i++) {
- for(int j = i+1; j < nums.length; j++){
- if(nums[i] == nums[j]) {
- // System.out.println(nums[i]);
- return nums[i];
- }
-
- }
- }
-
- return -1;
- }
- }
复制代码
2.two pointers
- class Solution {
- public int findDuplicate(int[] nums) {
- int slow = nums[0];
- int fast = nums[0];
-
- slow = nums[slow];
- fast = nums[nums[fast]];
-
- while(slow != fast){
- slow = nums[slow];
- fast = nums[nums[fast]];
- }
-
- int a = nums[0];
- int b = slow;
-
- while(a != b){
-
- a = nums[a];
- b = nums[b];
- }
- return a;
- }
- }
复制代码
3.二分法
- class Solution {
- public int findDuplicate(int[] nums) {
- int min = 0;
- int max = nums.length;
-
- while(min <= max){
- int mid = (max - min)/2 + min;
- int count = 0;
- for(int i = 0; i < nums.length; i++){
-
- if(nums[i] <= mid){
- count++;
- }
- }
-
- if(count > mid){
- max = mid -1;
- }
- else{
- min = mid + 1;
- }
- }
-
- return min;
- }
- }
复制代码 |
|