29. Divide Two Integers
整数相除,不能用除法或者乘法或者取模。如果溢出,返回INT_MAX。
重点:左移乘2:<<
思路:这里模拟整数相除,本质就是计算一个被除数包括多少个除数,这包含多少个,如果一个个累加肯定是太慢了,可以考虑二分的思路,两倍两倍来计算,利用位运算,每一步移位来计算。这里还需要注意的两个问题,一个是溢出,一个是符号。溢出考虑两种情况:divisor = 0;
dividend = INT_MIN and divisor = -1
(because abs(INT_MIN) = INT_MAX + 1).
符号计算:
int flag = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;
代码:
class Solution {
public:
int divide(int dividend, int divisor) {
if (divisor == 0 || (dividend == INT_MIN && divisor == -1)) return INT_MAX;
long long m = abs((long long)dividend), n = abs((long long)divisor), res = 0;
int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;
if (n == 1) return sign == 1 ? m : -m;
while (m >= n) {
long long t = n, p = 1;
while (m >= (t << 1)) {
t <<= 1;
p <<= 1;
}
res += p;
m -= t;
}
return sign == 1 ? res : -res;
}
};
34. Search for a Range
升序序列中,找到目标值的起始位置和终止位置。时间复杂度O(logn)
二分查找,找到后左右移动
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> res(2, -1);