题目要求:
算法分析:
这个题目实现起来较为简单,首先把两个数组合并成一个数组,再对这个新的数组排序(题目中给的正序感觉可能会有更节省时间的数据结构,我在此处并没有考虑),排序结束后直接按下标取数。要注意的是新数组的元素个数奇偶情况不同计算式也不同,直接if判断即可。
在第一次编码中,我在合并数组时没有写for循环,而是用了一个函数System.arraycopy()
,执行结果是正确的,但是提交后就报错,目前对这个报错不明觉厉。修改成经典for循环后就正确了。
源代码:
最开始运行失败的代码:
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
double []nums3 = new double[nums1.length + nums2.length];
System.arraycopy(nums1,0,nums3,0,nums1.length);
System.arraycopy(nums2,0,nums3,nums1.length,nums2.length); //合并数组
Arrays.sort(nums3); //对合并数组排序
if(nums3.length%2==0){
return (nums3[nums3.length/2]+nums3[nums3.length])/2;
}
else{
return nums3[(nums3.length-1)/2];
}
}
}
给出的编译错误提示:
修改后的代码:
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
double []nums3 = new double[nums1.length + nums2.length];
for(int i=0; i<nums1.length; i++){
nums3[i] = nums1[i];
}
for(int i=0; i<nums2.length; i++){
nums3[nums1.length + i] = nums2[i];
}//合并数组
Arrays.sort(nums3); //对合并数组排序
if(nums3.length%2==0){
return (nums3[nums3.length/2]+nums3[nums3.length/2-1])/2;
}
else{
return nums3[(nums3.length-1)/2];
}
}
}
结果:
笔记:
- 数组的合并:先放一个我觉得讲的很不错的链接—>Java中如何把两个数组合并为一个。第一次编译失败的原因是使用了
System.arraycopy()
,不知为什么会判错,但是这里还是想记录一下这个方法的用法: System.arraycopy()
:Java数组的复制操作可以分为深度复制和浅度复制,简单来说深度复制,可以将对象的值和对象的内容复制;浅复制是指对对象引用的复制,这一点可以类比python中的sort
方法和sorted()
函数的区别。System中提供了一个native静态方法arraycopy(),可以使用这个方法来实现数组之间的复制。对于一维数组来说,这种复制属性值传递,修改副本不会影响原来的值。对于二维或者一维数组中存放的是对象时,复制结果是一维的引用变量传递给副本的一维数组,修改副本时,会影响原来的数组。用法是:System.arraycopy(Object src,int srcPos, Object dest, int destPos,int length)
,下面这张图为复制过程(侵删)Arrays.sort()
:是Arrays类中的sort()方法,该方法是Arrays类的静态方法,在需要对数组进行排序时。括号内是数组名,也就是在内存中的首地址。常用方法:
-Arrays.sort(int[] a)
为将一个整型数组a由小到大排序。
-Arrays.sort(int[] a, cmp)
为将一个整型数组a由大到小排序。
-Arrays.sort(int[] a, int fromIndex, int toIndex)
为对数组部分排序,也就是对数组a的下标从fromIndex到toIndex-1的元素排序。
感想:
对java中的数组合并和排序算法有了一定的了解,但是第一次编译错误原因目前还不知道,以及题目中给的正序条件尚未用到,应该会有优化的方法。