合并两个有序数组
自己想出来的解法:
思路:
把题目看成将第二个数组中的元素插入第一个数组中。
即对于第二个数组中的每一个元素,找到其应在第一个数组中的位置,然后移动此位置后面的元素,最后将其插入在此位置。
代码:
性能:
分析:
时间:对于大量数组元素的移位拖慢了该算法的运行速度。
空间:没有多余的空间消耗,是该算法的优势。
可能的最优解法(来自leetcode官方题解):
思路:
由于两个输入数组原本就是有序的,所以可以利用双指针,从两个数组最后元素开始遍历(之所以从最后开始,是因为此题输出数组为输入数组之一,为了不创建为了避免输入数组的元素未被比较就被覆盖所创建的临时数组),将较大的元素,放在输出数组的最后,然后把剩下的元素copy进输出数组。
代码:
性能:
分析:
在时间和空间方面同时拥有良好的性能。
移除元素
自己想出来的解法:
思路:
双指针,头指针i,尾指针j,让i从前向后找到第一个为val的元素,让j从后向前找到第一个不为val的元素,两元素交换位置,循环到i<j,这样能保证所有val全部被放到数组后方,在j运动过程中,每找到一个为val的元素就count++。在几次提交错误后,增加了对于只有一个元素数组的特殊判断处理,增加对i和j不能超出数组边界的限制。
代码:
性能:
![](https://i-blog.csdnimg.cn/direct/bf11558726614847919437e72c23c59b.png)
分析:
在时间和空间方面同时拥有良好的性能。
可能的最优解法(来自leetcode官方题解):
思路:
与我自己想出来的解法思路相似,该解法思路更加简洁,实现也更加简单。
如果左指针 left 指向的元素等于 val,此时将右指针 right 指向的元素复制到左指针 left 的位置,然后右指针 right 左移一位。如果赋值过来的元素恰好也等于 val,可以继续把右指针 right 指向的元素的值赋值过来(左指针 left 指向的等于 val 的元素的位置继续被覆盖),直到左指针指向的元素的值不等于 val 为止。这样能维护区间 [0,left) 中的元素都不等于 val。当左右指针遍历完输入数组以后,left 的值就是输出数组的长度。
代码:
性能:
分析:
在时间和空间方面同时拥有良好的性能。