Leetcode_4_寻找两个有序数组的中位数

题目

在这里插入图片描述

解一:使用数组方法

涉及数组方法:
  • arr.splice(index,num,item);
    index:开始下表
    num:删除的元素个数
    item:要替换的元素
  • arr.sort((a,b) => a-b)
    • 如果没有参数,默认按照元素首字母在编码表中的顺序排序
    • 在原数组上操作
    • 如果想按照其他规则排序,需要提供比较函数
      • 比较函数有两个参数:a,b
      • 若排序后的数组中,a在b前,返回负数
      • 若与b相等,返回0
      • 若b在a前,返回正数
      • 两两比较,逐渐将元素代入到a,b中
    • 定式:
      • 数字由小到大排序:arr.sort((a,b)=>a-b);
      • 数字由大到小排序:arr.sort((a,b)=>b-a);
  • arr.concat(arr1):数组拼接
    • 将多个数组拼接为一个数组
    • arr1被拼接在arr后面
    • 返回一个新的数组,并不是在原数组上操作
代码:
    var findMedianSortedArrays = function(nums1, nums2) {
        if(nums1.length==0&&nums2.length==0){return ;}
        let arr = nums1.concat(nums2).sort((a,b)=>a-b);
        let num = 0;
        if(arr.length%2){
            num = arr[(arr.length+1)/2-1];
        }else{
            num = (arr[arr.length/2]+arr[arr.length/2-1])/2;
        }

        return num;
    };
解析:
  1. 注意参数判断是否为空
  2. 数组方法的掌握:concat(),sort()
  3. 在数组中计算中位数

解二:减少代码量

var findMedianSortedArrays = function(nums1, nums2) {
    const arr = [...nums1, ...nums2].sort((a, b) => a - b);
    const { length } = arr;
    return length % 2 ? arr[Math.floor(length / 2)] : (arr[length / 2] + arr[length / 2 - 1]) / 2;
};

作者:yujie-3
链接:https://leetcode-cn.com/problems/two-sum/solution/javascript-san-chong-shi-jian-fu-za-du-by-yujie-3/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
解析:

与上面自己写的算法差不多

注意:
1、 将数组合并,除了使用concat方法,还可以使用ES6中的省略符号

```
    let arr = [...nums1,...nums2];
```

2、 使用解构赋值来对length进行赋值操作

```
let {length} = arr;
```
将arr的length赋给length变量

```
    let {length,pop} = arr;
```

不仅可以获得数组的length属性,还可以获得数组的方法
3、 对于只有两种情况的判断语句,可以使用三元运算符
4、 Math对象常用方法:

  • Math.floor() : 对数进行下舍入
  • Math.ceil() : 对数进行上舍入
  • Math.abs() :返回绝对值
  • Math.random() :返回0~1的随机数
  • Math.round() :四舍五入
  • Math.pow(x,y) :返回x的y次幂

解三:双指针排序法

    var findMedianSortedArrays = function(nums1, nums2) {
    let reIndex = nums2.length - 1;
    for (let i = nums1.length - 1; i >= 0; i--) {
        while (nums1[i] <= nums2[reIndex] && reIndex > -1) {
            nums1.splice(i + 1, 0, ...(nums2.splice(reIndex, 1)));
            reIndex--;
        }
    }
    const arr = nums2.concat(nums1);
    const { length } = arr;
    return length % 2 ? arr[Math.floor(length / 2)] : (arr[length / 2] + arr[length / 2 - 1]) / 2;
};

作者:yujie-3
链接:https://leetcode-cn.com/problems/two-sum/solution/javascript-san-chong-shi-jian-fu-za-du-by-yujie-3/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

解三:二分查找法

    var findMedianSortedArrays = function(nums1, nums2) {
    if (nums1.length > nums2.length) [nums1, nums2] = [nums2, nums1];
    
    const length1 = nums1.length;
    const length2 = nums2.length;
    let min = 0;
    let max = length1;
    let half = Math.floor((length1 + length2 + 1) / 2);
    while (max >= min) {
        const i = Math.floor((max + min) / 2);
        const j = half - i;
        if (i > min && nums1[i - 1] > nums2[j]) {
            max = i - 1;
        } else if (i < max && nums1[i] < nums2[j - 1]) {
            min = i + 1;
        } else {
            let left,right;
            if (i === 0) left = nums2[j - 1];
            else if (j === 0) left = nums1[i - 1];
            else left = Math.max(nums1[i - 1], nums2[j - 1]);
            
            if (i === length1) right = nums2[j];
            else if (j === length2) right = nums1[i];
            else right = Math.min(nums1[i], nums2[j]);
            
            return (length1 + length2) % 2 ? left : (left + right) / 2;
        }
    }
    return 0;
};

作者:yujie-3
链接:https://leetcode-cn.com/problems/two-sum/solution/javascript-san-chong-shi-jian-fu-za-du-by-yujie-3/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值