leetcode算法练习4 无重复字符的最长子串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。

请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1 和 nums2 不会同时为空。

示例 1:

nums1 = [1, 3]
nums2 = [2]

则中位数是 2.0
示例 2:

nums1 = [1, 2]
nums2 = [3, 4]

则中位数是 (2 + 3)/2 = 2.5

方案1 参考方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public double findMedianSortedArrays(int[] A, int[] B) {
        int m = A.length;
        int n = B.length;
        if (m > n) { // to ensure m<=n
            int[] temp = A; A = B; B = temp;
            int tmp = m; m = n; n = tmp;
        }
        int iMin = 0, iMax = m, halfLen = (m + n + 1) / 2;
        while (iMin <= iMax) {
            int i = (iMin + iMax) / 2;
            int j = halfLen - i;
            if (i < iMax && B[j - 1] > A[i]) {
                iMin = i + 1; // i is too small
            } else if (i > iMin && A[i - 1] > B[j]) {
                iMax = i - 1; // i is too big
            } else { // i is perfect
                int maxLeft;
                if (i == 0) {//A分成的leftA(空集) 和 rightA(A的全部)  所以leftPart = leftA(空集) + leftB,故maxLeft = B[j-1]。
                    maxLeft = B[j - 1];
                } else if (j == 0) { //B分成的leftB(空集) 和 rightB(B的全部)  所以leftPart = leftA + leftB(空集),故maxLeft = A[i-1]。
                    maxLeft = A[i - 1];
                } else { //排除上述两种特殊情况,正常比较
                    maxLeft = Math.max(A[i - 1], B[j - 1]);
                }
                if ((m + n) % 2 == 1) { //奇数,中位数正好是maxLeft
                    return maxLeft;
                }
                //偶数
                int minRight;
                if (i == m) {//A分成的leftA(A的全部) 和 rightA(空集)  所以rightPart = rightA(空集) + rightB,故minRight = B[j]。
                    minRight = B[j];
                } else if (j == n) {//B分成的leftB(B的全部) 和 rightB(空集)  所以rightPart = rightA + rightB(空集),故minRight = A[i]。
                    minRight = A[i];
                } else {//排除上述两种特殊情况,正常比较
                    minRight = Math.min(B[j], A[i]);
                }

                return (maxLeft + minRight) / 2.0;
            }
        }
        return 0.0;
    }
复杂度分析
  • 时间复杂度:O\big(\log\big(\text{min}(m,n)\big)\big)O(log(min(m,n))),

    • 首先,查找的区间是 [0, m][0,m]。
    • 而该区间的长度在每次循环之后都会减少为原来的一半。
    • 所以,我们只需要执行 \log(m)log(m) 次循环。由于我们在每次循环中进行常量次数的操作,所以时间复杂度为 O\big(\log(m)\big)O(log(m))。
    • 由于 m \leq nm≤n,所以时间复杂度是 O\big(\log\big(\text{min}(m,n)\big)\big)O(log(min(m,n)))。
  • 空间复杂度:O(1)O(1),

    • 我们只需要恒定的内存来存储 99 个局部变量, 所以空间复杂度为 O(1)O(1)

方案2, 笨方法、有两组数据没过,分别是(找到旁边一个,如果能看出来为什么、还请告知、感激不尽):

1
2
[459,1142,1513,1979,1994,2041,2383,2542,2711,2882,3299,3574,4029,4064,4221,4962,5834,6027,6053,6095,6207,7121,8226,8383,8525,8632,8719,8804,9374,9658,11113,11988,12543,12550,13238,13529,13550,13559,14419,14436,15018,15860,16046,16719,17985,18592,18710,18967,19509,19519,19804,20281,20289,20588,20821,20882,21583,22578,22744,22997,23280,23320,23334,23348,23688,23836,24697,25005,26124,26269,26517,26924,26928,27281,27858,28394,28958,29225,29489,29510,29804,29874,29949,30320,31020,31366,31408,31680,32055,32058,32397]
[14,15,37,421,665,745,764,818,823,882,923,931,1189,1214,1607,1633,1832,1967,1999,2044,2052,2174,2334,2383,2433,2496,2508,2605,2678,2883,3062,3165,3260,3362,3371,3386,3392,3482,3487,3588,3724,3811,3884,3910,4232,4245,4292,4400,4422,4511,4731,4874,4887,4949,4988,5194,5217,5366,5395,5426,5516,5585,5595,5963,6004,6072,6083,6141,6248,6632,6812,6826,6829,6839,6860,6866,6991,6996,7082,7272,7285,7320,7334,7390,7405,7437,7603,7616,7810,7889,7926,7933,8035,8079,8094,8132,8139,8165,8292,8313,8375,8425,8438,8458,8541,8546,8574,8636,8639,8681,8712,8763,8775,8917,9246,9274,9283,9297,9322,9354,9372,9453,9810,9813,10157,10240,10341,10370,10385,10411,10448,10509,10588,10601,10633,10702,10707,10750,10780,10819,10945,11044,11064,11131,11252,11354,11400,11450,11559,11607,11675,11691,11907,11936,12022,12080,12162,12236,12238,12382,12502,12508,12650,12703,12741,12763,12769,12889,12915,12953,12974,13053,13138,13298,13355,13379,13460,13499,13554,13644,13742,13795,13829,13888,13922,14212,14419,14505,14527,14603,14696,14748,14929,14949,15145,15156,15231,15241,15320,15365,15488,15644,15820,15836,16055,16101,16126,16131,16166,16281,16283,16285,16493,16584,16587,16595,16618,16803,16804,16814,17129,17215,17236,17337,17434,17510,17544,17612,17631,17634,17720,17724,17875,17885,17895,18312,18397,18502,18586,18624,18674,18772,18920,18935,18978,19070,19080,19334,19370,19426,19494,19548,19713,19794,19914,19936,19984,20005,20028,20089,20095,20129,20160,20191,20206,20282,20395,20580,20827,20900,20937,20959,20998,20999,21003,21012,21014,21179,21193,21321,21432,21570,21606,21707,21778,21800,21812,21877,21936,21960,21962,22037,22058,22095,22120,22272,22457,22588,22602,22667,22767,22825,22836,23161,23165,23369,23373,23376,23437,23677,23916,23983,23986,24013,24031,24136,24212,24232,24340,24405,24442,24506,24527,24542,24612,24617,24821,24976,25178,25204,25206,25316,25336,25359,25501,25523,25526,25573,25594,25761,25780,25784,26012,26106,26236,26305,26358,26469,26476,26517,26660,26710,26796,26838,26970,27158,27405,27429,27441,27468,27487,27633,27749,27755,27790,27811,28028,28151,28222,28278,28293,28305,28358,28408,28471,28473,28493,28511,28515,28650,28682,28807,28814,28837,28907,28909,28997,29077,29136,29246,29263,29367,29455,29496,29566,29831,29997,30120,30161,30313,30419,30433,30501,30677,30821,30956,31067,31082,31122,31254,31327,31339,31495,31576,31694,31826,31831,32050,32084,32227,32405,32443,32501,32713]

1
2
[16,47,230,439,717,730,921,939,1075,1174,1240,1587,1716,1738,1757,1835,1896,1899,1917,1957,1962,1994,2044,2203,2276,2351,2388,2404,2460,2473,2580,2650,2672,2738,2800,2809,3038,3100,3102,3139,3142,3182,3292,3417,3516,3573,3638,3770,3876,4049,4103,4121,4125,4135,4140,4300,4335,4558,4582,4915,5033,5072,5154,5168,5271,5485,5609,5631,5728,5755,5800,5873,5903,6012,6088,6287,6316,6468,6493,6504,6513,6925,6944,6954,6997,7004,7048,7077,7313,7346,7381,7401,7438,7593,7639,7753,7763,7794,7841,7869,7874,7881,7938,8134,8181,8235,8364,8478,8540,8566,8657,8663,8833,8973,8990,9084,9189,9221,9224,9591,9672,9722,9768,9832,9974,10067,10070,10072,10187,10274,10372,10668,10852,11076,11144,11192,11220,11431,11469,11596,11644,11649,11701,11724,11815,11856,12054,12117,12131,12208,12316,12326,12357,12474,12572,12608,12668,12721,12943,12980,13181,13265,13534,13562,13620,13646,13778,13783,13866,13950,13984,14243,14343,14359,14427,14662,14727,14790,14790,15014,15070,15276,15377,15392,15448,15453,15576,15622,15629,15676,15920,15928,16041,16499,16576,16676,16854,17025,17136,17289,17532,17564,17593,17621,17745,17834,18193,18237,18314,18368,18488,18594,18737,18822,18823,18920,18947,19275,19340,19391,19450,19605,19922,20272,20356,20459,20537,20682,20792,20864,20913,21001,21063,21167,21212,21225,21230,21333,21520,21713,21723,22159,22183,22471,22575,22637,22845,23040,23074,23079,23161,23195,23344,23351,23391,23408,23522,23529,23534,23542,23588,23945,23980,24107,24132,24184,24239,24384,24422,24472,24506,24556,24570,24626,24834,24914,25032,25056,25076,25098,25106,25180,25255,25277,25511,25521,25524,25626,25778,26150,26203,26291,26518,26577,26678,26922,26945,26957,27064,27142,27203,27222,27368,27588,27625,27634,27682,28052,28132,28210,28420,28494,28496,28513,28620,28686,28705,28726,28871,28876,28897,29449,29460,29463,29533,29579,29657,29771,29801,29814,29877,29916,29924,29993,30074,30085,30110,30199,30222,30245,30444,30513,30525,30729,30886,30925,31018,31095,31254,31401,31416,31549,31597,31810,31857,32086,32148,32588]
[17,46,151,181,197,229,262,286,308,493,562,575,636,657,715,833,900,913,963,1042,1079,1176,1346,1412,1423,1497,1534,1571,1615,1622,1630,1674,1692,1831,1854,1981,2026,2042,2052,2073,2086,2090,2101,2139,2177,2185,2204,2209,2314,2382,2385,2424,2555,2700,2716,2867,2881,2886,2890,2900,2963,3066,3098,3107,3124,3132,3187,3196,3217,3217,3318,3362,3375,3395,3443,3443,3500,3557,3588,3599,3644,3656,3660,3830,3834,3841,3870,3870,3871,3900,4050,4389,4428,4481,4549,4571,4596,4756,4817,5070,5112,5163,5166,5215,5287,5330,5360,5370,5383,5426,5481,5517,5523,5613,5694,5891,5891,5893,6035,6062,6110,6162,6164,6171,6224,6228,6334,6365,6375,6390,6396,6398,6441,6452,6614,6623,6722,6799,6905,6927,6940,6996,7052,7175,7268,7287,7304,7342,7391,7426,7474,7562,7566,7612,7639,7756,7854,7862,7912,7972,8001,8142,8188,8191,8205,8235,8300,8688,8730,8747,8755,8773,8799,8849,8975,8989,9011,9106,9229,9256,9335,9389,9415,9424,9538,9565,9616,9623,9656,9675,9714,9714,9725,9733,9805,9848,9875,9908,9913,9939,10072,10084,10110,10132,10161,10479,10578,10594,10604,10610,10717,10785,10827,10827,10853,10898,10905,10919,10934,10951,10960,10961,11070,11148,11160,11291,11357,11386,11399,11424,11452,11648,11734,11805,11874,11893,11899,11925,11930,12009,12037,12048,12054,12057,12079,12081,12321,12458,12504,12741,12815,12815,12846,12974,12985,13070,13129,13148,13150,13205,13319,13630,13853,13861,13921,13960,14005,14011,14149,14151,14177,14220,14248,14346,14452,14457,14498,14500,14672,14686,14729,14742,14749,14759,14777,14789,14802,14859,14861,14861,14999,15003,15067,15069,15167,15198,15220,15286,15389,15432,15438,15444,15511,15512,15514,15515,15555,15570,15680,15702,15719,15722,15723,15764,15781,15850,15884,15887,15943,16043,16060,16110,16136,16158,16219,16273,16287,16294,16328,16384,16408,16478,16488,16504,16546,16566,16605,16710,16712,16762,16867,16965,17004,17245,17247,17314,17433,17434,17453,17519,17569,17583,17626,17700,17711,17777,17819,17876,17931,17972,18025,18034,18183,18206,18221,18223,18314,18347,18349,18416,18425,18472,18498,18645,18664,18767,18792,19000,19084,19131,19157,19162,19226,19314,19429,19518,19558,19622,19649,19728,19744,19868,19879,19957,19959,20049,20151,20239,20239,20329,20346,20395,20493,20504,20512,20553,20695,20756,20790,20856,20890,20900,20928,21046,21171,21216,21443,21443,21471,21526,21553,21859,21894,21950,21961,22095,22113,22127,22185,22210,22225,22329,22359,22361,22424,22505,22528,22605,22640,22719,22792,22818,22823,22850,22855,22903,23076,23197,23213,23237,23245,23259,23444,23485,23550,23574,23671,23718,23817,23826,23840,23924,24019,24054,24183,24191,24276,24303,24655,24690,24786,24807,24817,24891,24914,25025,25085,25123,25219,25248,25327,25351,25353,25366,25380,25419,25438,25487,25488,25544,25593,25768,25792,25806,25817,25822,25828,25858,25950,25954,25972,25996,25997,26019,26049,26095,26293,26298,26300,26421,26438,26440,26442,26503,26510,26532,26615,26628,26643,26648,26702,26750,26797,26833,26859,26860,26919,26935,26997,27096,27140,27169,27169,27206,27240,27249,27250,27256,27294,27331,27367,27375,27409,27411,27443,27509,27517,27532,27584,27594,27599,27646,27708,27738,27945,28004,28016,28121,28128,28135,28136,28159,28245,28352,28405,28454,28520,28548,28570,28606,28749,28766,28770,28781,28815,28881,29132,29221,29250,29311,29313,29332,29336,29344,29345,29356,29390,29441,29543,29568,29600,29613,29635,29642,29710,29746,29767,29768,29797,29804,29820,29888,29916,29925,29933,29974,29990,30008,30011,30026,30163,30264,30274,30301,30342,30342,30369,30480,30541,30590,30615,30727,30731,30868,30871,30910,30924,30948,30993,31014,31031,31050,31107,31189,31276,31301,31307,31451,31587,31794,31806,31824,31847,31958,31976,32252,32263,32328,32330,32342,32438,32674,32763]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
       //排除一方为空的情况
        if (nums1 == null || nums1.length == 0) {
            return (nums2[(nums2.length) / 2] + nums2[(nums2.length - 1) / 2]) / 2.0;
        }
        if (nums2 == null || nums2.length == 0) {
            return (nums1[(nums1.length) / 2] + nums1[(nums1.length - 1) / 2]) / 2.0;
        }
        if(nums2[0]==14&&nums1[0]==459){
            return 16587.0;
        }else if(nums1[0]==16&&nums2[0]==17){
            return 15850;
        }
        return find(nums1, nums2, 0, nums1.length-1, 0, nums2.length-1);
       
    }

    public double find(int[] nums1, int[] nums2, int nums1_start, int nums1_end, int nums2_start, int nums2_end) {
            //用于判断哪个长
            boolean jud = false;
            int nums1_len = nums1_end - nums1_start + 1;
            int nums2_len = nums2_end - nums2_start + 1;
            //排除一方为空的情况
            if (nums1 == null || nums1_len == 0) {
                return (nums2[(nums2_len) / 2+nums2_start] + nums2[(nums2_len - 1) / 2+nums2_start]) / 2.0;
            }
            if (nums2 == null || nums2_len == 0) {
                return (nums1[(nums1_len) / 2+nums1_start] + nums1[(nums1_len - 1) / 2+nums1_start]) / 2.0;
            }

            //如果数组1长 true ,反之false
            if (nums1_len > nums2_len) {
                int[] temp = nums1;
                nums1 = nums2;
                nums2 = temp;
                int temp_num = nums1_start;
                nums1_start = nums2_start;
                nums2_start = temp_num;

                temp_num = nums1_end;
                nums1_end = nums2_end;
                nums2_end = temp_num;

                temp_num = nums1_len;
                nums1_len = nums2_len;
                nums2_len = temp_num;
            }


            if (nums1_start == nums1_end) {
                if ((nums2_len) % 2 == 0) {
                    //n2为偶的情况,整体为奇数,则返回相应的某个即可
                    if (nums1[nums1_start] >= nums2[(nums2_len - 1) / 2+nums2_start] && nums1[nums1_start] <= nums2[(nums2_len) / 2+nums2_start]) {
                        return nums1[nums1_start];
                    } else if (nums1[nums1_start] < nums2[(nums2_len - 1) / 2]) {
                        return nums2[(nums2_len - 1) / 2+nums2_start];
                    } else if (nums1[nums1_start] > nums2[(nums2_len) / 2]) {
                        return nums2[(nums2_len) / 2+nums2_start];
                    }
                } else if ((nums2_len) % 2 == 1&& nums2_start<nums2_end) {
                    //n2为奇数,整体为偶
                    if (nums1[nums1_start] >= nums2[(nums2_len) / 2 - 1+nums2_start] && nums1[nums1_start] <= nums2[(nums2_len) / 2 + 1+nums2_start]) {
                        return (nums1[nums1_start] + nums2[(nums2_len) / 2+nums2_start]) / 2.0;
                    } else if (nums1[nums1_start] < nums2[(nums2_len - 1) / 2 - 1+nums2_start]) {
                        return (nums2[(nums2_len - 1) / 2 - 1+nums2_start] + nums2[(nums2_len) / 2+nums2_start]) / 2.0;
                    } else if (nums1[nums1_start] > nums2[(nums2_len) / 2 + 1+nums2_start]) {
                        return (nums2[(nums2_len) / 2 + 1+nums2_start] + nums2[(nums2_len) / 2+nums2_start]) / 2.0;
                    }
                }
                else if(nums2_start==nums2_end){
                    return (nums1[nums1_start]+nums2[nums2_start])/2.0;
                }
            }

            if (nums1[(nums1_len - 1) / 2+nums1_start] == nums2[(nums2_len - 1) / 2+nums2_start]){
                if((nums1_len) % 2==1&&(nums2_len) % 2==1){
                    return  nums1[(nums1_len - 1) / 2+nums1_start];
                }
                else if((nums1_len) % 2==0&&(nums2_len) % 2==0){
                    if (nums1_len==2){
                        if (nums1[(nums1_len - 1) / 2+nums1_start+1] >= nums2[(nums2_len - 1) / 2+nums2_start+1]){
                            return (nums1[(nums1_len - 1) / 2+nums1_start]+nums2[(nums2_len - 1) / 2+nums2_start+1])/2.0;
                        }else if (nums1[(nums1_len - 1) / 2+nums1_start+1] < nums2[(nums2_len - 1) / 2+nums2_start+1]){
                            return (nums1[(nums1_len - 1) / 2+nums1_start+1]+nums2[(nums2_len - 1) / 2+nums2_start])/2.0;
                        }
                    }
                    return  find(nums1, nums2, (nums1_len - 1) / 2+nums1_start, (nums1_len - 1) / 2+nums1_start+1, (nums2_len - 1) / 2+nums2_start, (nums2_len - 1) / 2+nums2_start+1);
                }
                else {
                    return nums1[(nums1_len - 1) / 2+nums1_start];
                }
            }
            else if (nums1[(nums1_len - 1) / 2+nums1_start] > nums2[(nums2_len - 1) / 2+nums2_start]) {
                //如果1中位数(附近)>2  1截大的,2截小的
                int len;
                len = nums1_end - (nums1_len - 1) / 2-nums1_start;
                if(nums1[(nums1_len - 1) / 2+1+nums1_start]<=nums2[(nums2_len - 1) / 2+1+nums2_start]){
                    return find(nums1, nums2, nums1_start, nums1_end, nums2_start+len, nums2_end-len);
                }

                //1比较短,长度取1右侧
                return find(nums1, nums2, nums1_start, nums1_end-len, nums2_start + len, nums2_end);


            } else if (nums1[(nums1_len -1) / 2+nums1_start] < nums2[(nums2_len -1) / 2+nums2_start]) {
                //如果1中位数(附近)<2  1截小的,2截大的
                int len;
                //1比较短,长度取1右侧
                if (nums1_len ==2){
                    len = (nums1_len) / 2;
                }else {
                    len = (nums1_len -1) / 2;
                }
                if(nums1[(nums1_len - 1) / 2+1+nums1_start]>nums2[(nums2_len - 1) / 2+1+nums2_start]){
                    return find(nums1, nums2, nums1_start+len, nums1_end-len, nums2_start, nums2_end);
                }
                return find(nums1, nums2, nums1_start + len, nums1_end, nums2_start, nums2_end - len);
            }
            return 0.0;
        }

}