双指针学习2

 该算法暴力解法为创建一个新的数组nums,然后将nums1与nums2中的值一一放入nuns中并排序,最后在返回nums的中位数。该方法时间复杂度与空间复杂度过于复杂。

int[] nums = new int[nums1.length + nums2.length];
        int i = 0,j = 0;
        while (i < nums1.length && j < nums2.length){
            if(nums1[i] < nums2[j]){
                nums[i + j] = nums1[i];
                i++;
            }else {
                nums[i + j] = nums2[j];
                j++;
            }
        }
        while (i < nums1.length){
            nums[i + j] = nums1[i];
            i++;
        }
        while (j < nums2.length){
            nums[i + j] = nums2[j];
            j++;
        }
        int mid = nums.length;
        if(mid%2 != 0){
            return nums[mid/2 ];
        }else {
            return (float)(nums[mid/2] + nums[mid/2 - 1])/2;
        }

事实上,我们只需要获得nums的中位数并返回。因此,可以使用双指针,left从头部开始遍历,right从尾部开始遍历,如果头尾指针相遇,说明找到了中位数,返回(left+rigth)/2的值。

        //如果nums1或nums2中有一个为空,直接调用方法
        if(nums1.length == 0){
            return findmid(nums2);
        }

        if(nums2.length == 0){
            return findmid(nums1);
        }

        //找到两个数组的首尾下标
        int nums1_left = 0,nums2_left = 0,nums1_right = nums1.length-1,nums2_right = nums2.length-1;

        //定义需要的值
        int left = 0;
        int right = 0;


        while (nums1_left <= nums1_right && nums2_left <= nums2_right){
            //从左到右寻找中位数
            if(nums1[nums1_left] < nums2[nums2_left]){
                left = nums1[nums1_left];
                nums1_left++;
            }else {
                left = nums2[nums2_left];
                nums2_left++;
            }
            //从右到左寻找中位数
            if(nums1[nums1_right] > nums2[nums2_right]){
                right = nums1[nums1_right];
                nums1_right--;
            }else {
                right = nums2[nums2_right];
                nums2_right--;
            }
            //当nums1或nums2遍历完成并且没找到中位数时,在另一个数组中接着找
            while (nums1_left > nums1_right && nums2_left <= nums2_right){
                left = nums2[nums2_left];
                nums2_left++;
                right = nums2[nums2_right];
                nums2_right--;
            }
            while (nums2_left > nums2_right && nums1_left <= nums1_right){
                left = nums1[nums1_left];
                nums1_left++;
                right = nums1[nums1_right];
                nums1_right--;
            }

        }
        //返回中位数
        return (float)(right + left)/2;

public static double findmid(int[] nums) {
        if (nums.length % 2 != 0) {
            return nums[nums.length / 2];
        } else {
            return (float) (nums[nums.length / 2] + nums[nums.length / 2 - 1]) / 2;
        }
    }

这个方法可以节省大部分时间,并不需要创建一个新的数组来存储nums1与nums2中的值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值