ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【算法学习日志】一道双指针(误)

2021-09-09 22:02:41  阅读:153  来源: 互联网

标签:p2 p1 nums1 算法 n1 n2 日志 nums2 指针


回归玩家,沉迷了好几天原神了,人事是一点不干天天就知道玩

题目来自力扣寻找两个正序数组的中位数

class Solution {
    public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
        //定义两个布尔指针判断数组1和数组2是否到了尽头,指针p1p2用来遍历
        int p1 = 0,p2 = 0;
        int n1 = nums1.length,n2 = nums2.length;
        //两个数组都未遍历到尽头
        if(p1 < n1 && p2 < n2){
            while(p1 + p2 < (n1 + n2)/2-1) {
                if (p1 == n1 || p2 == n2) {
                    break;
                }
                if (nums1[p1] < nums2[p2]) p1++;
                else p2++;
            }
        }
        //nums1到尽头 nums2没有
        if(p1 >= n1 && p2 < n2){
            while(p1 + p2 < (n1 + n2)/2-1){
                p2++;
            }
        }
        //nums1没到尽头 nums2到了
        if(p1 < n1 && p2 >= n2){
            while(p1 + p2 < (n1 + n2)/2-1){
                p1++;
            }
        }
        //定义left取n/2-1索引处的位置,right取n/2
        double left = 0,right = Double.MAX_VALUE;
        if(p1 < n1 && p2 < n2){
            left = nums1[p1] < nums2[p2] ? nums1[p1++] : nums2[p2++];
            if(p1 == n1 || p2 == n2){
                right = p2 == n2 ? nums1[p1] : nums2[p2];
            }else{
                right = nums1[p1] < nums2[p2] ? nums1[p1] : nums2[p2];
            }
        }else if(p1 >= n1 && p2 < n2){
            left = nums2[p2];
            if(p2 < n2-1)  right = nums2[p2+1];
        }else if(p1 < n1 && p2 >= n2){
            left = nums1[p1];
            if(p1 < n1-1) right = nums1[p1+1];
        }

        double mid = 0;
        if((n1+n2) % 2 == 1){
            //如果n数字太小导致取不到right
            if(right == Double.MAX_VALUE) mid =left;
            else mid = right;
        }else{
            mid = (left+right)/2;
        }
        return mid;
    }
}

时间复杂度是O(m+n)

如果用类似归并的想法去做的话应该能到O(log(m+n))这样

不管了等会再看吧!还差20抽保底!稻妻一堆任务没做!今天一定要把雷神肝出来!

标签:p2,p1,nums1,算法,n1,n2,日志,nums2,指针
来源: https://blog.csdn.net/weixin_43994069/article/details/120210915

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有