文章目录
- [一、lc88 合并两个有序数组](#一、lc88 合并两个有序数组)
- 二、lc27移除元素
一、lc88 合并两个有序数组
O((M+N)Log(M+N))时间复杂度
直接把nums2数组拼接到nums1数组后面,再调用sort函数排序,代码如下,需要注意nums1数组长度为0这个特殊情况
java
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
if(m==0){
for(int i=0;i<n;i++){
nums1[i] = nums2[i];
}
}
else{
for(int i=0 ; i < n;i++){
nums1[m+i] = nums2[i];
}
Arrays.sort(nums1);
}
}
}
O(M+N)时间复杂度
逆向考虑问题,设置三个指针i,j,k,分别表示nums1还剩数据长度,nums2还剩数据长度,下一个插入位置,当i,j不为0时,对nums[i-1]和nums2[j-1]进行大小比较,大的插入到nums1[k-1]位置(长度从1开始计算,数组下标从0开始,所以需要减一),再移动i,j,当i,j其中一个插入完毕后循环退出,如果i不为0,表示nums1上还有数据未遍历到,但已经在返回数组上了,不需要额外操作,如果j不为0,遍历nums2剩下的数据插入到nums1前面。
对于从后插入是否会覆盖数据:因为两个数组已经按非递减排序,所以不会
java
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
if(m==0){
for(int i=0;i<n;i++){
nums1[i] = nums2[i];
}
}
else{
int i=m,j=n,k=m+n;
while(i>0 && j>0){
if(nums1[i-1]>=nums2[j-1]){
nums1[k-1]=nums1[i-1];
i--;
}
else{
nums1[k-1]=nums2[j-1];
j--;
}
k--;
}
if(j>0){
for(int s = 0; s<j;s++){
nums1[s]=nums2[s];
}
}
}
}
}
二、lc27移除元素
添加辅助数组
遍历nums数组,把非val元素放入辅助数组ans中,遍历完成后,把ans数组的数据放回nums数组前面
java
class Solution {
public int removeElement(int[] nums, int val) {
int n = nums.length-1;
if(n<0) return 0;
int k=0;
int[] ans = new int[n+1];
for(int i = 0;i<=n;i++){
if(nums[i]!=val){
ans[k]=nums[i];
k++;
}
}
if(k>0){
for(int i=0;i<k;i++){
nums[i]=ans[i];
}
}
return k;
}
}
2.原数组拷贝
遍历nums数组,如果取出的num不等于val就进行拷贝,再ans+1,如果相等,继续遍历
此方法本质上为快慢指针,num元素下标为快指针,遍历整个数组,ans为慢指针,为下一个插入非val元素的位置
java
class Solution {
public int removeElement(int[] nums, int val) {
int ans = 0;
for(int num: nums) {
if(num != val) {
nums[ans] = num;
ans++;
}
}
return ans;
}
}