在一個長度爲n+1的數組裏的所有數字都在1 ~n的範圍內,所以數組中至少有一個數字是重複 的。從數組中找出任意一個重複的數字,但不能 修改輸入的數組。如{2,3,5,4,3,2,6,7}得到2或者3
#include <iostream> #include <vector> using namespace std; int duplicateInArray0(vector<int>& nums) { //暴力 n*n int n = nums.size(); for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < n; j++) { if (nums[i] ^ nums[j] == 0) return nums[i]; } } return 0; } int duplicateInArray(vector<int>& nums) { //二分 n* logn int l = 1, r = nums.size() - 1; while (l < r) { int mid = l + r >> 1; //[l, mid] [mid+ 1, r] int count = 0; for (int i = 0; i < nums.size(); i++) { if (nums[i] >= l && nums[i] <= mid) count++; } if (count > mid - l + 1) r = mid; else l = mid + 1; } return l; } int main() { int a[8] = { 2, 3, 5, 4, 3, 2, 6, 7 }; vector<int> nums; //將a的所有元素插入到b中 nums.insert(nums.begin(), a, a + 9); cout << "暴力解答:" << duplicateInArray(nums) << endl; cout << "二分解答:" << duplicateInArray(nums) << endl; return 0; }
class Solution { public: bool duplicate(int nums[], int n, int* out) { for (int i = 0; i < n; i++) { while (nums[i] != i) { if (nums[i] == nums[nums[i]]) { out[0] = nums[i]; return true; } else swap(nums[i], nums[nums[i]]); } } return false; } void swap( int i, int j) { } };