LeetCode里有特色的问题存档

002* Median of Two Sorted Arrays

There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

 1 class Solution:
 2     def findKth(self, A, A_start, B, B_start, k):
 3         if A_start >= len(A):
 4             return B[B_start + k - 1]
 5         if B_start >= len(B):
 6             return A[A_start + k - 1]
 7         if k == 1:
 8             return min(A[A_start], B[B_start])
 9         A_key = 0x3f3f3f3f
10         if A_start + k / 2 - 1 < len(A):
11             A_key = A[A_start + k / 2 - 1]
12         B_key = 0x3f3f3f3f
13         if B_start + k / 2 - 1 < len(B):
14             B_key = B[B_start + k / 2 - 1]
15         if A_key < B_key:
16             return self.findKth(A, A_start + k / 2, B, B_start, k - k / 2)
17         else:
18             return self.findKth(A, A_start, B, B_start + k / 2, k - k / 2)
19     # @return a float
20     def findMedianSortedArrays(self, A, B):
21         n = len(A) + len(B)
22         if n % 2 == 0:
23             return (self.findKth(A, 0, B, 0, n / 2) + self.findKth(A, 0, B, 0, n / 2 + 1)) / 2.0
24         else:
25             return self.findKth(A, 0, B, 0, n / 2 + 1)

出自算法导论9.3-8,设X[1..n]和Y[1..n]为两个数组,每个都包含n个已排好序的数。给出一个求数组X和Y中所有2n个元素的中位数的、O(lgn)时间算法。

 1 int findMedian(int A[],int B[],int n,int low,int high) {
 2     if (low > high) return NOT_FOUND;
 3     else {
 4         int k = (low+high)/2;
 5         if (k==n && A[n]<=B[1]) return A[n];
 6         else if (k<n && B[n-k]<=A[k] && A[k]<=B[n-k+1]) return A[k];
 7         else if (A[k] > B[n-k+1]) return findMedian(A,B,n,low,k-1);
 8         else return findMedian(A,B,n,k+1,high);
 9     }
10 }
11 int twoArrayMedian(int X[],int Y[],int n) {
12     int median = findMedian(X,Y,n,1,n);
13     if (median==NOT_FOUND) median = findMedian(Y,X,n,1,n);
14     return median;
15 }  

我们要取下中位数,注意到一个数x是中位数,当且仅当有n-1个数比x小,有n个数比x大,我们首先假设中位数在数组A中,二分中位数可能在的位置。
假设中位数所在区间为[L,R],k为(L+R)/2。若A[k]是中位数,数组A中有k-1个数比A[k]小,n-k个数比A[k]大。若B中有n-k个数比A[k]小,有k个数比A[k]大,则A[k]是中位数。
由于B是已排序的,因此B[n-k]<=A[k]<=B[n-k+1]。
若A[k]>B[n-k+1],则比A[k]小的数至少有n个,所以中位数小于A[k],因此在区间[L,k-1]中。
反之则在区间[k+1,R]中。
若L>R,则中位数不在A中,对B数组进行同样的二分操作即可。

时间: 2024-12-17 23:05:21

LeetCode里有特色的问题存档的相关文章

Word Break II 求把字符串拆分为字典里的单词的所有方案 @LeetCode

这道题类似  Word Break 判断是否能把字符串拆分为字典里的单词 @LeetCode 只不过要求计算的并不仅仅是是否能拆分,而是要求出所有的拆分方案.因此用递归. 但是直接递归做会超时,原因是LeetCode里有几个很长但是无法拆分的情况,所以就先跑一遍Word Break,先判断能否拆分,然后再进行拆分. 递归思路就是,逐一尝试字典里的每一个单词,看看哪一个单词和S的开头部分匹配,如果匹配则递归处理S的除了开头部分,直到S为空,说明可以匹配. public class Solution

Word Break II 求把字符串拆分为字典里的单词的全部方案 @LeetCode

这道题相似  Word Break 推断能否把字符串拆分为字典里的单词 @LeetCode 只不过要求计算的并不不过能否拆分,而是要求出全部的拆分方案. 因此用递归. 可是直接递归做会超时,原因是LeetCode里有几个非常长可是无法拆分的情况.所以就先跑一遍Word Break,先推断能否拆分.然后再进行拆分. 递归思路就是,逐一尝试字典里的每个单词,看看哪一个单词和S的开头部分匹配,假设匹配则递归处理S的除了开头部分,直到S为空.说明能够匹配. Given a string s and a

【LeetCode】 Maximum Subarray

Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, given the array [−2,1,−3,4,−1,2,1,−5,4], the contiguous subarray [4,−1,2,1] has the largest sum = 6. More practice: If you have figu

Leetcode - Letter Combination Of A Phone Number

Given a digit string, return all possible letter combinations that the number could represent. A mapping of digit to letters (just like on the telephone buttons) is given below. Input:Digit string "23" Output: ["ad", "ae", &q

[LeetCode] 807. Max Increase to Keep City Skyline

807.Max Increase to Keep City Skyline In a 2 dimensional array grid, each value grid[i][j] represents the height of a building located there. We are allowed to increase the height of any number of buildings, by any amount (the amounts can be differen

【LeetCode】Add Two Numbers(两数相加)

这道题是LeetCode里的第2到题. 这道题的条件判断很简单,如下: 1.是否为尾节点 2.是否产生进位 3.是否等于9 4.是否需要拓展空间 代码如下: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode *p = l1, *q = l2; int add, carry = 0;//carry标志进位 while (1) { add = p->val + q->val + carry; p->val = add

LeetCode 5 迅速判断回文串的曼切斯特算法

题意 Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000. Link: https://leetcode.com/problems/longest-palindromic-substring/ 翻译 给定一个字符串s,要求它当中的最长回文子串.可以假设s串的长度最大是1000. 样例 Example 1: Input:

LeetCode56 Merge Intervals

题目: Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,10],[15,18],return [1,6],[8,10],[15,18]. (Hard) 分析: 前两天做google的笔试,中间有一道题用到关于区间merge的问题,就把leetcode上这两道区间合并题目先做一下. 思路就是先对每个区间的起始位置进行排序,然后维护一个left和rig

给出两个单词(start和end)与一个字典,找出从start到end的最短转换序列

问题 给出两个单词(start和end)与一个字典,找出从start到end的最短转换序列.规则如下: 一次只能改变一个字母 中间单词必须在字典里存在 例如: 给出 start = "hit"end = "cog"dict = ["hot","dot","dog","lot","log"] 返回 [ ["hit","hot",&