[5, 7, 7, 8, 8, 10], target = 8
[5, 7, 7, 8, 8, 10], target = 6
[], target = 8
vector<int> searchRange(vector<int>& nums, int target)
{
int f = BinarySearch(nums, target);
return (f >= nums.size() || nums[f] != target) ? vector<int>(2, -1) : vector<int>{f, BinarySearch(nums, target+1)-1};
}
int BinarySearch(vector<int>& nums, int target)
{
int min = 0;
int max = nums.size();
while ( min < max )
{
int middle = ( max + min ) / 2;
(nums[middle] < target) ? min = middle + 1 : max = middle;
}
return max;
}
if (arr[middle] < target) { min = middle + 1 }
else { max = middle }
[-2, 1, -3, 4, -1, 2, 1, -5, 4]
[4, -1, 2, 1]
[4, -1, 2, -1]
+ [-5]
–> smaller[-2]
最大值 == -2[-2, 1]
最大值 == 1
[1, -3]
最大值 == -2[1, -3, 4]
最大值 == 4
[4, -1]
最大值 == 3[4, -1, 2]
最大值 == 5[4, -1, 2, 1]
最大值 == 6[4, -1, 2, 1, -5]
最大值 == -1[4, -1 ,2, 1, -5, 4]
最大值 == 3
int maxSubArray(vector<int>& nums)
{
int size = nums.size();
int max = nums[0];
for (int i = 1; i < size; i++)
{
int temp = nums[i-1] + nums[i];
nums[i] = temp > nums[i] ? temp : nums[i];
max = nums[i] > max ? nums[i] : max;
}
return max;
}
[a, y, b]
[a, y, b, x]
之最大子陣列,必為包含或不包含 [a, y, b]
之陣列,即 不可能發生 [y, b, x]
> [a, y, b, x]
8
2.82842
// for 一個一個慢慢找
int mySqrt(int x)
{
for (int i = 1; i <= (x / 2) + 1; i++)
{
if (x / i == i) return i;
if (x / i < i) return i - 1;
}
return 0;
}
// Binary search
int mySqrt(int x)
{
if(x == 0) return 0;
int left = 1, right = x;
while(left <= right)
{
int mid = left + (right - left) / 2;
if(mid == x / mid)
return mid;
else if(mid > x / mid)
right = mid - 1;
else
left = mid + 1;
}
return right;
}
3
1 + 1 + 1
OR 1 + 2
OR 2 + 1
// 建表法
int climbStairs(int n)
{
uint stairs[50] = {0, 1, 2};
for(int i = 3; i < 50; i++)
{
stairs[i] = stairs[i-1] + stairs[i-2];
}
return stairs[n];
}
// 公式解
int climbStairs(int n)
{
double coeff = sqrt(5.0);
double left = pow((1 + coeff) / 2, n + 1);
double right = pow((1 - coeff) / 2, n + 1);
return (int)((double)(left - right) / coeff);
}
[[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
// Binary Search
bool searchMatrix(vector<vector<int>>& matrix, int target)
{
int m = matrix.size();
int n = matrix[0].size();
return binary_search(matrix, 0, m*n-1, target);
}
bool binary_search(vector<vector<int>>& matrix, int start, int end, int target)
{
if (start > end)
return false;
int n = matrix[0].size();
int middle = (start + end) / 2;
int i = middle / n;
int j = middle % n;
if (matrix[i][j] > target)
return binary_search(matrix, start, middle-1, target);
else if (matrix[i][j] < target)
return binary_search(matrix, middle+1, end, target);
else
return true;
return false;
}
[10, 2, 5, 3]
arr[0] = arr[2] * 2
// 暴力解
bool checkIfExist(vector<int>& arr)
{
for (int i = 0; i < arr.size(); i++)
{
for (int j = 0; j < arr.size(); j++)
{
if (i != j && (arr[i] == 2 * arr[j] || arr[j] == 2 * arr[i]))
{
return true;
}
}
}
return false;
}
// Binary Search
bool checkIfExist(vector<int>& arr)
{
sort(arr.begin() , arr.end());
int countZero = 0;
for(int i = 0; i < arr.size(); i++)
{
if(arr[i] == 0) countZero++;
if(binary_search(arr.begin(), arr.end(), 2*arr[i]))
{
if(arr[i] == 0 and countZero > 1) return true;
if(arr[i] != 0) return true;
}
}
return false;
}
// Hash table
bool checkIfExist(vector<int>& arr)
{
map<int, int> hash;
for (int i = 0; i < arr.size(); i++)
hash[arr[i]]++;
for (int i = 0; i < arr.size(); i++)
{
if (arr[i] == 0)
{
if (hash[0] > 1) return true;
}
else
{
if (arr[i] % 2 == 0 && hash.count(arr[i] / 2))
return true;
if (hash.count(arr[i] + arr[i]))
return true;
}
}
return false;
}
其中,0 至少要出現兩次,才算存在其倍數,因此可以把 0 當 special case 處理
C++ STL
std::map
internally is a Red-Black tree.
std::unordered_map
is a Hash Table.
Find times are O(log N) vs O(1) respectively.