题目:力扣https://leetcode-cn.com/problems/median-of-two-sorted-arrays/
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
double median;
int[] nums3 = combine(nums1,nums2);
nums3 = sort(nums3);
double[] nums4 = new double[nums3.length];
for(int i=0;i<nums3.length;i++){
nums4[i] = (double)nums3[i];
}
median = mid(nums4);
return median;
}
public int[] combine(int[] nums1,int[] nums2){
int[] temp = new int[nums1.length+nums2.length];
for(int i=0;i<nums1.length;i++){
temp[i] = nums1[i];
}
for(int j=0;j<nums2.length;j++){
temp[nums1.length+j] = nums2[j];
}
return temp;
}
public int[] sort(int[] temp){
int p;
for(int i=0;i<temp.length;i++){
for(int j=i+1;j<temp.length;j++){
if(temp[i]>temp[j]){
p = temp[i];
temp[i] = temp[j];
temp[j] = p;
}
}
}
return temp;
}
public double mid(double[] temp){
double t;
int s;
if(temp.length%2==1){
s = (temp.length-1)/2;
t = temp[s];
}else{
double sum;
s = temp.length/2;
sum = temp[s]+temp[s-1];
t = sum/2;
}
return t;
}
}
(这题leetcode定义的难度为“困难”,但是若按照我这种常规思路去做其实是非常简单的,当然,面试官肯定也不会满意这种答案的。奈何暂时水平有限,先凑合着吧。)
思路:非常非常常规(low)的思路,合并,排序,折中。
1.合并两个数组,用新的数组储存。
public int[] combine(int[] nums1,int[] nums2){
int[] temp = new int[nums1.length+nums2.length];
for(int i=0;i<nums1.length;i++){
temp[i] = nums1[i];
}
for(int j=0;j<nums2.length;j++){
temp[nums1.length+j] = nums2[j];
}
return temp;
}
2.对已经完成合并的新数组进行排序,从大到小或者从小到大都无所谓,我这里是从小到大排序的。
public int[] sort(int[] temp){
int p;
for(int i=0;i<temp.length;i++){
for(int j=i+1;j<temp.length;j++){
if(temp[i]>temp[j]){
p = temp[i];
temp[i] = temp[j];
temp[j] = p;
}
}
}
return temp;
}
3.对排序成功的数组进行折中寻找中位数,这里需要分类讨论。若数组长度为奇数,则中位数为最中间的那个数;若数组长度为偶数,则需要将最中间的两个数求和取平均作为中位数。值得注意的是,最后中位数可能出现小数的情况,则需要用double数据类型去表示,所以此时折中找中位数的方法也是double类型的。
public double mid(double[] temp){
double t;
int s;
if(temp.length%2==1){
s = (temp.length-1)/2;
t = temp[s];
}else{
double sum;
s = temp.length/2;
sum = temp[s]+temp[s-1];
t = sum/2;
}
return t;
}
4.上面写的是三个单独的方法,按照逻辑调用即可。for循环是将int类型的数组,强制转换成double类型的数组,以便于调用这种找中位数(mid)方法。
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
double median;
int[] nums3 = combine(nums1,nums2);
nums3 = sort(nums3);
double[] nums4 = new double[nums3.length];
for(int i=0;i<nums3.length;i++){
nums4[i] = (double)nums3[i];
}
median = mid(nums4);
return median;
}
5.返回中位数。
return median;