二分法
剑指 Offer 11. 旋转数组的最小数字
class Solution {
public:
int minArray(vector<int>& numbers) {
int low = 0;
int high = numbers.size() - 1;
while (low < high) {
int mid = low + (high - low) / 2;//防止溢出
if (numbers[mid] > numbers[high]) {
low = mid + 1;
} else if(numbers[mid] < numbers[low]) {
high = mid; //不可以是high = mid - 1;
} else{
high -= 1;
}
}
return numbers[low];
}
};
小技巧
1572. 矩阵对角线元素的和
class Solution {
public:
int diagonalSum(vector<vector<int>>& mat) {
int r = mat.size();
if(r == 1) return mat[0][0];
int ans = 0;
for (int i = 0; i < r; i++) {
ans += mat[i][i];
ans += mat[i][r - i - 1];
}
ans -= mat[(r - 1) / 2][(r - 1) / 2] * (r & 1);// * (r & 1) 判断奇偶
return ans;
}
};
389. 找不同
异或用得很厉害。
class Solution {
public:
char findTheDifference(string s, string t) {
char exor = 0;
for (char c : s + t) {
exor ^= c;
}
return exor;
}
};