力扣第912题、56题 排序

912.排序数组

image.png

快速排序

推荐

  1. var sortArray = function(nums) {
  2. if(nums.length <= 1){return nums}
  3. let pivotIndex = Math.floor(nums.length / 2)
  4. let pivot = nums.splice(pivotIndex,1)[0]
  5. let left = []
  6. let right = []
  7. for(let i = 0; i < nums.length; i++){
  8. if(nums[i] < pivot){
  9. left.push(nums[i])
  10. }else{
  11. right.push(nums[i])
  12. }
  13. }
  14. return sortArray(left).concat([pivot],sortArray(right))
  15. };

思路:找个基准,把它单独提出来,把他和剩下的数进行比较,比基准小的放左边,比基准大的放右边,然后左右两边重复此操作,最后把左、基准、右拼起来返回

选择排序

不推荐,容易超时

  1. var sortArray = function(nums) {
  2. for (let i = 0; i < nums.length; i++) {
  3. let min = Infinity; //最小数的值
  4. let minIndex; //最小数的下标
  5. for (j = i; j < nums.length; j++) {
  6. if (nums[j] < min) {
  7. min = nums[j] //更新最小值
  8. minIndex = j; //更新下标
  9. }
  10. }
  11. [nums[i], nums[minIndex]] = [nums[minIndex], nums[i]];
  12. //交换数组中的位置
  13. }
  14. return nums;
  15. };

思路:每次找到当前范围的最小值,跟当前循环的i交换位置,也就是放到最前面,然后i++

56.合并区间

image.png

排序加贪心

思路:先排序,然后贪心算法。sort()排序好后,把当前区间的左边界和上一个区间的右边界进行比较,如果是上一个区间的有边界大,那么就Math.max()它们的右边界合并区间,如果当前边界的左区间大,就把整个区间push到数组目标数组里面
image.png
image.png

  1. var merge = function(intervals){
  2. if(intervals === null || !intervals.length){
  3. return intervals
  4. }
  5. intervals.sort((a,b) => a[0] - b[0])
  6. const result = []
  7. result.push(intervals[0])
  8. for(let i = 1; i < intervals.length; i++){
  9. if(result[result.length-1][1] < intervals[i][0]){
  10. result.push(intervals[i])
  11. }else{
  12. result[result.length-1][1] = Math.max(
  13. result[result.length-1][1],
  14. intervals[i][1]
  15. )
  16. }
  17. }
  18. return result
  19. }