69. x 的平方根
int mySqrt(int x)
{
if(x == 1) {
return 1;
}
int left = 0;
int right = x;
while(left < right - 1) {
int m = (left + right) / 2;
if(m > x / m) {
right = m;
}
else {
left = m;
}
}
return left;
}
744. 寻找比目标字母大的最小字母
char nextGreatestLetter(char* letters, int lettersSize, char target)
{
int left = 0, right = lettersSize - 1;
while (left <= right) {
int m = (left + right) / 2;
if (letters[m] <= target) {
left = m + 1;
}
else {
right = m - 1;
}
}
return left < lettersSize ? letters[left] : letters[0];
}
540. 有序数组中的单一元素
int singleNonDuplicate(int* nums, int numsSize)
{
int left = 0, right = numsSize - 1;
while (left < right - 1) {
int m = (left + right) / 2;
if (m % 2 == 1) {
m--;
}
if (nums[m] == nums[m + 1]) {
left = m + 2;
}
else {
right = m;
}
}
return nums[left];
}
278. 第一个错误的版本
// Forward declaration of isBadVersion API.
bool isBadVersion(int version);
int firstBadVersion(int n)
{
int left = 1, right = n;
while (left < right) {
int m = left + (right - left) / 2;
if (isBadVersion(m)) {
right = m;
}
else {
left = m + 1;
}
}
return left;
}
153. 寻找旋转排序数组中的最小值
int findMin(int* nums, int numsSize)
{
int left = 0, right = numsSize - 1;
while (left < right) {
int m = left + (right - left) / 2;
if (nums[m] <= nums[right]) {
right = m;
}
else {
left = m + 1;
}
}
return nums[left];
}
34. 在排序数组中查找元素的第一个和最后一个位置
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* searchRange(int* nums, int numsSize, int target, int* returnSize)
{
int* result = (int*)malloc(sizeof(int) * 2);
result[0] = -1;
result[1] = -1;
*returnSize = 2;
int left = 0, right = numsSize;
while (left < right) {
int m = left + (right - left) / 2;
if (nums[m] >= target) {
right = m;
}
else {
left = m + 1;
}
}
if (right != numsSize && nums[left] == target) {
result[0] = left;
}
left = 0, right = numsSize;
while (left < right) {
int m = left + (right - left) / 2;
if (nums[m] > target) {
right = m;
}
else {
left = m + 1;
}
}
if (left != 0 && nums[left - 1] == target) {
result[1] = left - 1;
}
return result;
}