代码实现:
// 交换 void swap(int *m, int *n) { int temp = *m; *m = *n; *n = temp; } // 快排 void sort(int **nums, int l, int r) { // 左闭右开 if (r - l <= 2) { if (r - l <= 1) { // 剩余个数:<= 1 return; } if (nums[r - 1][1] < nums[l][1]) { // 剩余个数:= 2 且后者小于前者 交换 swap(&nums[r - 1][0], &nums[l][0]); swap(&nums[r - 1][1], &nums[l][1]); } return; } int x = nums[l][0]; int y = nums[l][1]; int i = l, j = r - 1; while (i < j) { while (i < j && nums[j][1] >= y) { j--; } if (i < j) { nums[i][0] = nums[j][0]; nums[i][1] = nums[j][1]; i++; } while (i < j && nums[i][1] <= y) { i++; } if (i < j) { nums[j][0] = nums[i][0]; nums[j][1] = nums[i][1]; j--; } } nums[i][0] = x, nums[i][1] = y; sort(nums, l, i); sort(nums, i + 1, r); } int findMinArrowShots(int **points, int pointsSize, int *pointsColSize){ if (pointsSize <= 1) { return pointsSize; } // 按右区间快排 sort(points, 0, pointsSize); // 左闭右开 int end = points[0][1]; int num = 1; for (int i = 1; i < pointsSize; i++) { if (points[i][0] > end) { num++; end = points[i][1]; } } return num; }