162. 寻找峰值
峰值元素是指其值大于左右相邻值的元素。
给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。
数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。
你可以假设 nums[-1] = nums[n] = -∞。
class Solution {
public:
int binarySearch(vector<int> &nums, int lo, int hi) {
if(lo == hi)
return lo;
int mid_ = (lo + hi) / 2;
if(nums[mid_] > nums[mid_ + 1])
return binarySearch(nums, lo, mid_);
return binarySearch(nums, mid_ + 1, hi);
}
int findPeakElement(vector<int>& nums) {
return binarySearch(nums, 0, nums.size() - 1);
}
};
29. 两数相除
class Solution {
public:
int mydiv(int a, int b) {
if (a < b)
return 0;
int rate_ = 1;
int acc = b;
while (a - acc > acc) {
rate_ += rate_;
acc += acc;
}
return rate_ + mydiv(a - acc, b);
}
int divide(int dividend, int divisor) {
if (dividend == 0) return 0;
else if (divisor == 1) return dividend;
else if (divisor == -1) return (dividend == INT_MIN) ? INT_MAX : -dividend;
int ret_ = 0;
// false 表示结果为正, 否则为负
bool symbolFlag_ = false;
if ((dividend < 0 && divisor > 0) || (divisor < 0 && dividend > 0))
symbolFlag_ = true;
if (divisor == INT_MIN) { //处理b为特殊值的情况
return (dividend == INT_MIN) ? 1 : 0;
}
// 处理dividend为特殊值的情况,因为如果dividend = INT_MIN,则abs取模会失败
if (dividend == INT_MIN) {
dividend = symbolFlag_ ? dividend + divisor : dividend - divisor;
ret_++;
}
// 取绝对值
dividend = abs(dividend);
divisor = abs(divisor);
ret_ += mydiv(dividend, divisor);
ret_ = symbolFlag_ ? -ret_ : ret_;
return ret_;
}
};