Leetcode4. Median of Two Sorted Arrays
There are two sorted arrays nums1 and nums2 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)).
Example 1:
nums1 = [1, 3]
nums2 = [2]
The median is 2.0
Example 2:
nums1 = [1, 2]
nums2 = [3, 4]
The median is (2 + 3)/2 = 2.5
int findKth(int A[], int B[], int k, int aStart,int aEnd,
int bStart, int bEnd)
{
int aLen = aEnd - aStart + 1;
int bLen = bEnd - bStart + 1;
if(aLen == 0) return B[bStart + k];
if(bLen == 0) return A[aStart + k];
if(k == 0) return A[aStart] < B[bStart] ? A[aStart] : B[bStart];
int aMid = aLen * k / (aLen + bLen);
int bMid = bLen * k / (aLen + bLen);
aMid += aStart;
bMid += bStart;
if(A[aMid] > B[bMid])
{
k = k - (bMid - bStart + 1);
aEnd = aMid;
bStart = bMid + 1;
}
else
{
k = k - (aMid - aStart + 1);
bEnd = bMid;
aStart = aMid + 1;
}
return findKth(A, B, k, aStart, aEnd, bStart, bEnd);
}
double findMedianSortedArrays(int A[], int B[])
{
int m = alength;
int n = bLength;
if((m + n) % 2 != 0)
return (double)findKth(A, B, (m+n) / 2, 0, m-1, 0, n-1);
else
{
return (
(findKth(A, B, (m + n) / 2, 0, m - 1, 0, n - 1) +
findKth(A, B, (m + n) / 2-1, 0, m - 1, 0, n - 1))*0.5
);
}
}
在《Java编程思想》P86页有这样一段话:
“static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”
这段话虽然只是说明了static方法的特殊之处,但是可以看出static关键字的基本作用,简而言之,一句话来描述就是:
方便在没有创建对象的情况下来进行调用(方法/变量)。
很显然,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。
static可以用来修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能。
static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
但是要注意的是,虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。