二分法
| |
| |
| |
| |
| |
| |
| |
| bool exist(struct TreeNode *root, int height, int k) { |
| |
| int count = height - 1; |
| |
| while (count-- > 0) { |
| if (root == NULL) break; |
| |
| int bit = ((k >> count) & 1); |
| if (bit == 0) { |
| root = root->left; |
| } else { |
| root = root->right; |
| } |
| } |
| |
| |
| return root != NULL; |
| } |
| |
| int binarySearch(struct TreeNode *root, int height, int left, int right) { |
| int mid; |
| |
| while (left <= right) { |
| mid = (right - left) / 2 + left; |
| if (exist(root, height, mid)) { |
| |
| left = mid + 1; |
| } else { |
| right = mid - 1; |
| } |
| } |
| return right; |
| } |
| |
| |
| int countNodes(struct TreeNode *root) { |
| if (root == NULL) return 0; |
| struct TreeNode *node = root; |
| int height = 0; |
| while (node != NULL) { |
| height++; |
| node = node->left; |
| } |
| |
| |
| int left = (1 << (height - 1)); |
| |
| int right = (1 << height) - 1; |
| return binarySearch(root, height, left, right); |
| } |
| int cmp(const void *a, const void *b) { |
| return (*(int *) a - *(int *) b); |
| } |
| |
| |
| int findLeft(int *nums, int left, int right, int target) { |
| int mid; |
| while (left <= right) { |
| mid = (right - left) / 2 + left; |
| if (nums[mid] >= target) |
| right = mid - 1; |
| else |
| left = mid + 1; |
| } |
| return left; |
| } |
| |
| |
| int findRight(int *nums, int left, int right, int target) { |
| int mid; |
| while (left <= right) { |
| mid = (right - left) / 2 + left; |
| if (nums[mid] > target) |
| right = mid - 1; |
| else |
| left = mid + 1; |
| } |
| return right; |
| } |
| |
| |
| int *targetIndices(int *nums, int numsSize, int target, int *returnSize) { |
| qsort(nums, numsSize, sizeof(int), cmp); |
| int left = findLeft(nums, 0, numsSize - 1, target); |
| int right = findRight(nums, 0, numsSize - 1, target); |
| int count = right - left + 1; |
| |
| *returnSize = 0; |
| if (count <= 0)return NULL; |
| int *res = (int *) malloc(sizeof(int) * count); |
| for (int i = 0; i < count; ++i) { |
| res[(*returnSize)++] = left + i; |
| } |
| return res; |
| } |
| int countPos(int *array, int start, int end) { |
| |
| if (array[end] <= 0) return 0; |
| |
| int i; |
| int j = end; |
| |
| int left = start, right = end; |
| int mid; |
| while (left <= right) { |
| mid = ((right - left) >> 1) + left; |
| if (array[mid] > 0) |
| right = mid - 1; |
| else |
| left = mid + 1; |
| } |
| i = left; |
| return j - i + 1; |
| } |
| |
| int countNeg(int *array, int start, int end) { |
| |
| if (array[start] >= 0) return 0; |
| |
| int i = start; |
| int j; |
| |
| int left = start, right = end; |
| int mid; |
| while (left <= right) { |
| mid = ((right - left) >> 1) + left; |
| if (array[mid] >= 0) |
| right = mid - 1; |
| else |
| left = mid + 1; |
| } |
| j = right; |
| return j - i + 1; |
| } |
| |
| int maximumCount(int *nums, int numsSize) { |
| int i = countPos(nums, 0, numsSize - 1); |
| int j = countNeg(nums, 0, numsSize - 1); |
| return i > j ? i : j; |
| } |
| |
| int findPosition(int *array, int left, int right) { |
| int mid; |
| int target = -1; |
| while (left <= right) { |
| mid = (right - left) / 2 + left; |
| if (array[mid] <= target) |
| right = mid - 1; |
| else |
| left = mid + 1; |
| } |
| return left; |
| } |
| |
| |
| int countNegatives(int **grid, int gridSize, int *gridColSize) { |
| int res = 0; |
| for (int i = 0; i < gridSize; ++i) { |
| res += gridColSize[i] - findPosition(grid[i], 0, gridColSize[i] - 1); |
| } |
| return res; |
| } |
| |
| int findPosition(int *array, int left, int right) { |
| int mid; |
| int target = -1; |
| while (left <= right) { |
| mid = (right - left) / 2 + left; |
| if (array[mid] <= target) |
| right = mid - 1; |
| else |
| left = mid + 1; |
| } |
| return left; |
| } |
| |
| |
| |
| int countNegatives(int **grid, int gridSize, int *gridColSize) { |
| int res = 0; |
| |
| int tempPos = gridColSize[0]; |
| int temp; |
| |
| for (int i = 0; i < gridSize; ++i) { |
| |
| temp = findPosition(grid[i], 0, tempPos - 1); |
| res += gridColSize[i] - temp; |
| |
| tempPos = temp; |
| } |
| return res; |
| } |
| int cmp(const void *a, const void *b) { |
| return (*(int *) a - *(int *) b); |
| } |
| |
| |
| int binarySearch(int *array, int left, int right, int target) { |
| int mid; |
| while (left <= right) { |
| mid = ((right - left) >> 1) + left; |
| if (array[mid] <= target) |
| left = mid + 1; |
| else |
| right = mid - 1; |
| } |
| return right; |
| } |
| |
| int *answerQueries(int *nums, int numsSize, int *queries, int queriesSize, int *returnSize) { |
| int *res = (int *) malloc(sizeof(int) * queriesSize); |
| *returnSize = queriesSize; |
| qsort(nums, numsSize, sizeof(int), cmp); |
| |
| |
| int sum[numsSize]; |
| sum[0] = nums[0]; |
| for (int i = 1; i < numsSize; ++i) { |
| sum[i] = sum[i - 1] + nums[i]; |
| } |
| |
| |
| for (int i = 0; i < queriesSize; ++i) { |
| res[i] = binarySearch(sum, 0, numsSize - 1, queries[i]) + 1; |
| } |
| return res; |
| } |
| |
| int peakIndexInMountainArray(int *arr, int arrSize) { |
| int left = 0; |
| int right = arrSize - 1; |
| int mid; |
| while (left < right) { |
| mid = left + (right - left) / 2; |
| if (arr[mid] < arr[mid + 1]) { |
| |
| left = mid + 1; |
| } else if (arr[mid] > arr[mid + 1]) { |
| |
| right = mid; |
| } |
| } |
| return left; |
| } |
| |
| int *twoSum(int *numbers, int numbersSize, int target, int *returnSize) { |
| int *res = (int *) malloc(sizeof(int) * 2); |
| *returnSize = 0; |
| |
| int left = 0, right = numbersSize - 1; |
| |
| while (left < right) { |
| if (numbers[left] == target - numbers[right]) { |
| res[0] = numbers[left]; |
| res[1] = numbers[right]; |
| *returnSize = 2; |
| return res; |
| } else if (numbers[left] > target - numbers[right]) { |
| right--; |
| } else { |
| left++; |
| } |
| } |
| return res; |
| } |
| |
| int *twoSum(int *numbers, int numbersSize, int target, int *returnSize) { |
| int *res = (int *) malloc(sizeof(int) * 2); |
| *returnSize = 0; |
| |
| int *hashMap = (int *) calloc(2000001, sizeof(int)); |
| for (int i = 0; i < numbersSize; ++i) { |
| if ((target - numbers[i]) > 0 && hashMap[target - numbers[i]] == 1) { |
| res[0] = numbers[i]; |
| res[1] = target - numbers[i]; |
| *returnSize = 2; |
| return res; |
| } |
| hashMap[numbers[i]] = 1; |
| } |
| return res; |
| } |
| |
| |
| int binarySearch(int *array, int left, int right) { |
| if (left > right) return -1; |
| int mid = ((right - left) >> 1) + left; |
| |
| int leftAns = binarySearch(array, left, mid - 1); |
| if (leftAns != -1) return leftAns; |
| |
| if (array[mid] == mid) return mid; |
| |
| return binarySearch(array, mid + 1, right); |
| } |
| |
| int findMagicIndex(int *nums, int numsSize) { |
| return binarySearch(nums, 0, numsSize - 1); |
| } |
| |
| |
| int *twoSum(int *numbers, int numbersSize, int target, int *returnSize) { |
| int *res = (int *) malloc(sizeof(int) * 2); |
| *returnSize = 0; |
| |
| int left = 0, right = numbersSize - 1; |
| |
| while (left < right) { |
| if (numbers[left] == target - numbers[right]) { |
| res[0] = left; |
| res[1] = right; |
| *returnSize = 2; |
| return res; |
| } else if (numbers[left] > target - numbers[right]) { |
| right--; |
| } else { |
| left++; |
| } |
| } |
| return res; |
| } |
| int binarySearch(int *array, int left, int right, int target) { |
| int mid; |
| while (left <= right) { |
| mid = ((right - left) >> 1) + left; |
| if (array[mid] == target) { |
| return mid; |
| } else if (array[mid] > target) { |
| right = mid - 1; |
| } else { |
| left = mid + 1; |
| } |
| } |
| return -1; |
| } |
| |
| |
| |
| int *twoSum(int *numbers, int numbersSize, int target, int *returnSize) { |
| int *res = (int *) malloc(sizeof(int) * 2); |
| *returnSize = 0; |
| |
| for (int i = 0; i < numbersSize; ++i) { |
| int k = binarySearch(numbers, i + 1, numbersSize - 1, target - numbers[i]); |
| if (k != -1) { |
| res[0] = i; |
| res[1] = k; |
| *returnSize = 2; |
| return res; |
| } |
| } |
| return res; |
| } |
| |
| int cmp(const void *a, const void *b) { |
| return (*(int *) a - *(int *) b); |
| } |
| |
| |
| int binarySearch1(int *array, int size, int target) { |
| int left = 0; |
| int right = size - 1; |
| int mid; |
| while (left <= right) { |
| mid = left + (right - left) / 2; |
| if (target > array[mid]) |
| left = mid + 1; |
| else if (target <= array[mid]) |
| right = mid - 1; |
| } |
| |
| return left; |
| } |
| |
| |
| int binarySearch2(int *array, int size, int target) { |
| int left = 0; |
| int right = size - 1; |
| int mid; |
| while (left <= right) { |
| mid = left + (right - left) / 2; |
| if (target >= array[mid]) |
| left = mid + 1; |
| else if (target < array[mid]) |
| right = mid - 1; |
| } |
| return right; |
| } |
| |
| |
| int findTheDistanceValue(int *arr1, int arr1Size, int *arr2, int arr2Size, int d) { |
| qsort(arr2, arr2Size, sizeof(int), cmp); |
| int sum = 0; |
| for (int i = 0; i < arr1Size; ++i) { |
| int right = binarySearch1(arr2, arr2Size, arr1[i]); |
| int left = binarySearch2(arr2, arr2Size, arr1[i]); |
| printf("%d %d\n", left, right); |
| if ((left < 0 || abs(arr2[left] - arr1[i]) > d) |
| && (right >= arr2Size || abs(arr2[right] - arr1[i]) > d)) { |
| |
| sum++; |
| |
| } |
| } |
| return sum; |
| } |
| int cmp(const void *a, const void *b) { |
| return *(int *) a - *(int *) b; |
| } |
| |
| int binarySearch(int *array, int size, int target) { |
| int left = 0; |
| int right = size - 1; |
| int mid; |
| while (left <= right) { |
| mid = ((right - left) >> 1) + left; |
| if (target == array[mid]) |
| return mid; |
| else if (target < array[mid]) |
| right = mid - 1; |
| else |
| left = mid + 1; |
| } |
| return -1; |
| } |
| |
| int *fairCandySwap(int *aliceSizes, int aliceSizesSize, int *bobSizes, int bobSizesSize, int *returnSize) { |
| int *res = (int *) malloc(sizeof(int) * 2); |
| *returnSize = 2; |
| |
| |
| qsort(bobSizes, bobSizesSize, sizeof(int), cmp); |
| int sum1 = 0, sum2 = 0; |
| for (int i = 0; i < aliceSizesSize; ++i) sum1 += aliceSizes[i]; |
| for (int i = 0; i < bobSizesSize; ++i) sum2 += bobSizes[i]; |
| |
| |
| |
| |
| int gap = sum1 - sum2; |
| |
| for (int i = 0; i < aliceSizesSize; ++i) { |
| int t = binarySearch(bobSizes, bobSizesSize, aliceSizes[i] - gap / 2); |
| if (t != -1) { |
| res[0] = aliceSizes[i]; |
| res[1] = bobSizes[t]; |
| return res; |
| } |
| } |
| return res; |
| } |
| int cmp(const void *a, const void *b) { |
| return (*(int *) a) - (*(int *) b); |
| } |
| |
| |
| int binarySearch(int *array, int size, int target) { |
| int left = 0; |
| int right = size - 1; |
| int mid; |
| while (left <= right) { |
| mid = ((right - left) >> 1) + left; |
| if (array[mid] >= target) |
| right = mid - 1; |
| else |
| left = mid + 1; |
| } |
| return left; |
| } |
| |
| int specialArray(int *nums, int numsSize) { |
| qsort(nums, numsSize, sizeof(int), cmp); |
| for (int i = 0; i <= nums[numsSize - 1]; ++i) { |
| int index = binarySearch(nums, numsSize, i); |
| if (numsSize - index == i) |
| return i; |
| } |
| return -1; |
| } |
| |
| int *intersect(int *nums1, int nums1Size, int *nums2, int nums2Size, int *returnSize) { |
| int min = nums1Size > nums2Size ? nums2Size : nums1Size; |
| int *res = (int *) malloc(sizeof(int) * min); |
| *returnSize = 0; |
| int *hashMap = (int *) calloc(1001, sizeof(int)); |
| |
| |
| for (int i = 0; i < nums1Size; ++i) hashMap[nums1[i]]++; |
| for (int i = 0; i < nums2Size; ++i) { |
| if (hashMap[nums2[i]] > 0) { |
| |
| hashMap[nums2[i]]--; |
| res[(*returnSize)++] = nums2[i]; |
| } |
| } |
| return res; |
| } |
| |
| int binarySearch(int *array, int left, int right, int target) { |
| int mid; |
| while (left <= right) { |
| mid = ((right - left) >> 1) + left; |
| if (array[mid] >= target) |
| right = mid - 1; |
| else |
| left = mid + 1; |
| } |
| return left; |
| } |
| |
| int cmp(const void *a, const void *b) { |
| return *(int *) a - *(int *) b; |
| } |
| |
| |
| int *intersect(int *nums1, int nums1Size, int *nums2, int nums2Size, int *returnSize) { |
| int min = nums1Size > nums2Size ? nums2Size : nums1Size; |
| int *res = (int *) malloc(sizeof(int) * min); |
| *returnSize = 0; |
| |
| |
| qsort(nums1, nums1Size, sizeof(int), cmp); |
| qsort(nums2, nums2Size, sizeof(int), cmp); |
| |
| int j = 0; |
| for (int i = 0; i < nums1Size && j < nums2Size; ++i) { |
| int k = binarySearch(nums2, j, nums2Size - 1, nums1[i]); |
| if (k >= 0 && k < nums2Size && nums1[i] == nums2[k]) { |
| res[(*returnSize)++] = nums1[i]; |
| |
| j = k + 1; |
| } |
| } |
| return res; |
| } |
| int binarySearch(char **words, int left, int right, char *s) { |
| int mid; |
| while (left <= right) { |
| |
| while (left <= right && strcmp(words[left], "") == 0) left++; |
| while (left <= right && strcmp(words[right], "") == 0) right--; |
| |
| mid = ((right - left) >> 1) + left; |
| |
| if (strcmp(words[mid], "") == 0) { |
| |
| int leftAns = binarySearch(words, left, mid - 1, s); |
| if (leftAns != -1) return leftAns; |
| |
| return binarySearch(words, mid + 1, right, s); |
| } |
| |
| |
| int k = strcmp(words[mid], s); |
| if (k == 0) { |
| return mid; |
| } else if (k > 0) { |
| right = mid - 1; |
| } else if (k < 0) { |
| left = mid + 1; |
| } |
| } |
| |
| return -1; |
| } |
| |
| |
| int findString(char **words, int wordsSize, char *s) { |
| return binarySearch(words, 0, wordsSize - 1, s); |
| } |
| int findString(char **words, int wordsSize, char *s) { |
| int left = 0, right = wordsSize - 1; |
| int mid; |
| while (left <= right) { |
| mid = ((right - left) >> 1) + left; |
| int beforeMid = mid; |
| |
| |
| while (mid <= right && strcmp(words[mid], "") == 0) { |
| mid++; |
| } |
| |
| if (mid <= right) { |
| |
| if (strcmp(words[mid], s) == 0) { |
| return mid; |
| } else if (strcmp(words[mid], s) > 0) { |
| right = beforeMid - 1; |
| } else { |
| left = mid + 1; |
| } |
| } else { |
| right = beforeMid - 1; |
| } |
| } |
| return -1; |
| } |
| |
| int findKthPositive(int *arr, int arrSize, int k) { |
| int left = 0, right = arrSize - 1; |
| int mid; |
| while (left <= right) { |
| mid = ((right - left) >> 1) + left; |
| |
| int lossCount = arr[mid] - mid - 1; |
| |
| if (lossCount >= k) { |
| |
| right = mid - 1; |
| } else { |
| left = mid + 1; |
| } |
| } |
| |
| |
| if (right >= 0) { |
| |
| |
| |
| |
| |
| |
| |
| |
| return k - (arr[right] - (right) - 1) + arr[right]; |
| } |
| return k; |
| } |
| |
| int binarySearch1(int *array, int size, int target) { |
| int left = 0, right = size - 1; |
| int mid; |
| while (left <= right) { |
| mid = ((right - left) >> 1) + left; |
| if (array[mid] >= target) |
| right = mid - 1; |
| else |
| left = mid + 1; |
| } |
| return left; |
| } |
| |
| |
| int binarySearch2(int *array, int size, int target) { |
| int left = 0, right = size - 1; |
| int mid; |
| while (left <= right) { |
| mid = ((right - left) >> 1) + left; |
| if (array[mid] <= target) |
| left = mid + 1; |
| else |
| right = mid - 1; |
| } |
| return right; |
| } |
| |
| int countTarget(int *scores, int scoresSize, int target) { |
| int left = binarySearch1(scores, scoresSize, target); |
| int right = binarySearch2(scores, scoresSize, target); |
| if(left >= scoresSize || scores[left] != target) return 0; |
| return right - left + 1; |
| } |
| |
| |
| int findMin(int *nums, int numsSize) { |
| int left = 0; |
| int right = numsSize - 1; |
| int mid; |
| |
| while (left < right) { |
| mid = left + (right - left) / 2; |
| |
| if (nums[mid] > nums[right]) { |
| |
| left = mid + 1; |
| } else if (nums[mid] < nums[right]) { |
| |
| right = mid; |
| } else { |
| |
| right--; |
| } |
| } |
| return nums[left]; |
| } |
| |
| int arrangeCoins(int n) { |
| int left = 1, right = n; |
| long int mid; |
| |
| while (left <= right) { |
| mid = ((right - left) >> 1) + left; |
| long int sum = (1 + mid) * mid >> 1; |
| if (sum <= n) |
| left = mid + 1; |
| else |
| right = mid - 1; |
| } |
| return right; |
| } |
| |
| bool isPerfectSquare(int num) { |
| int left = 0; |
| int right = num; |
| long int mid; |
| while (left <= right) { |
| mid = ((right - left) >> 1) + left; |
| long int temp = mid * mid; |
| if (temp <= num) |
| left = mid + 1; |
| else |
| right = mid - 1; |
| } |
| return right * right == num; |
| } |
| |
| int mySqrt(int x) { |
| int left = 0; |
| int right = x; |
| long int mid; |
| while (left <= right) { |
| mid = ((right - left) >> 1) + left; |
| long int temp = mid * mid; |
| if (temp <= x) |
| left = mid + 1; |
| else |
| right = mid - 1; |
| } |
| return right; |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步