1、思考直接排序+对比前后元素,排序算法采用快排,但不知为何结果显示:超过时间限制(可能递归调用耗时较多),调用C++自带的sort排序能够实现,并不超时。
2、hash表方法,映射
3、辅助空间为O(1)的算法
class Solution {
public:
typedef struct {
int *elem;
int count;
}HashTable;
int findRepeatNumber(vector<int>& nums) {
//QuickSort(nums,0,nums.size()-1);
//sort(nums.begin(),nums.end());
//for(int i=0;i<nums.size()-1;i++)
//{
//if (nums[i] == nums[i+1]){
//return nums[i];
//}
//}
//hash方法
/*HashTable H;
H.count = nums.size();
H.elem = new int [H.count];
for(int i=0;i<nums.size();i++){
H.elem[i] = -1;
}
for(int i=0;i<nums.size();i++){
if (H.elem[nums[i]]!=-1)
return nums[i];
else
H.elem[nums[i]] = nums[i];
}
*/
//不需要占用额外空间的解法
for(int i=0;i<nums.size();i++){
while(nums[i] != i){
if (nums[i] == nums[nums[i]])
return nums[i];
else{
int temp = nums[i];
nums[i] = nums[nums[i]];
nums[temp] = temp;
}
}
}
return -1;
}
二分法查找:如果找到就找同大小的第一个位置,如果没有找到。最后start和end同时指向的值便为我们要的值。
class Solution {
public:
/**
* 二分查找
* @param n int整型 数组长度
* @param v int整型 查找值
* @param a int整型vector 有序数组
* @return int整型
*/
int upper_bound_(int n, int v, vector<int>& a) {
// write code here
int m = HalfSearch(v,a,n);
if (m<=n && m>0)
return m;
else
return n+1;
}
int HalfSearch(int value,vector<int>& a,int n )
{
int mid;
int start = 0;
int end = n-1;
int flag =0;
while (start <= end )
{
mid = (start+end)/2;
if ( value == a[mid] )
{
int temp = mid;
while (temp >0 && a[temp] == a[temp-1])
{
temp--;
}
return temp+1;
}
else if (value < a[mid])
{
end = mid-1;
//flag = 1;
}
else{
start = mid+1;
//flag = 2;
}
}
/*(if (flag == 1)
return end+2;
else*/
return start+1;
}
};