C++ 算法(一)

在一個長度爲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) {

	}
};

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章