算法虐我千百遍,我待算法仍如初恋(二)
懒鬼有话说:好久没有刷算了。好吧!我承认,是我太懒了。今天还是先写个算法来练练手吧!今天没有按照那100道题的顺序来做,今天做的是Leetcode的第88题。
手刃算法第三式:合并两个有序数组
给你两个按 非递减顺序 排列的整数数组
nums1
**和nums2
,另有两个整数m
和n
,分别表示nums1
和nums2
中的元素数目。 请你 合并nums2
**到nums1
中,使合并后的数组同样按 非递减顺序 排列。
注意: 最终,合并后数组不应由函数返回,而是存储在数组
nums1
中。为了应对这种情况,nums1
的初始长度为m + n
,其中前m
个元素表示应合并的元素,后n
个元素为0
,应忽略。nums2
的长度为n
。
题目分析
这道题简单来说就是将两个递增的数组按照递增的顺序合并成到其中的一个数组中。这道题其实就是一道简单的双指针问题,设置两个指针,然后通过指针移动来判断数组中元素的大小,进行排序。
具体代码实现如下
var merge = function(nums1,m,nums2,n){
let i=0,j=0
while(i<nums1.length && j<nums2.length){
if(nums1[i]>nums2[j]){
nums1.splice(i,0,nums2[j])
i++;j++;m++
}else{
i++
}
}
if(i==nums1.length){
nums1.splice(m,n)
for(let k=j; k<nums2.length; k++){
nums1.push(nums2[k])
}
}
else if(j==nums2.length){
nums1.splice(m,n)
}
}
通过画图来分析这段代码:
设置两个指针i,j
分别指向两个数组的左边,然后再判断两个这两个数组元素的大小,如果 i 指向的数小于 j 指向的数,那么就将 i++,否则就将 j 指向的那个数插入到左边的数组中,同时两个指针同时左移,第一个数组的实际长度也加1,直到 i 移动到底或者是 j 移动到底结束循环此时我们将得到这样两种情况:
对于第一种情况就是 i 移动到底后还有另一个数组还没有完全合并进去。这时候我们首先就要把后面的0给切掉然后再将5,6,给插进去。而后面的那种情况其实就已经完成合并了,就只用把后面的0给切掉就行了。
这样讲不知道咋样,这个想法我感觉不是好难,其实我也就只能讲到这种程度了。
另外的算法思想
1.分别为两个数组及将要合并后的那个数组设置指针,从后往前找,比较两个合并之前数组元素的大小,较大的一个就放进合并后的数组的最后一位,然后所有的指针都往后移。具体的过程就是这个样子,本来想好好弄一下的,实在搞不来,还是得委屈兄弟们将就一下了。
- 设置一个新的数组,比较之前的两个数组的元素的大小,将小的那个元素放入新的数组中。
小结
通过这段时间的算法,耳濡目染了一点,感觉找到一点感觉了(对这个双指针方面)。这道题目还有两种想法没有实现,下次有时间的时候把这两个想法实现一下。学习不能落下啊,兄嘚。最近写文章好像有点不太顺手了,是知识储备不够还是这段是时间生疏了。不清楚,要补回来了哟!!!
转载自:https://juejin.cn/post/7379831020496306213