88.合并两个有序数组
题意:
给你两个按 非递减顺序 排列的整数数组
nums1
和nums2
,另有两个整数m
和n
,分别表示nums1
和nums2
中的元素数目。请你 合并
nums2
到nums1
中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组
nums1
中。为了应对这种情况,nums1
的初始长度为m + n
,其中前m
个元素表示应合并的元素,后n
个元素为0
,应忽略。nums2
的长度为n
【输入样例】nums1=[1,2,3,0,0,0],m=3,nums2=[2,5,6],n=3
【输出样例】[1,2,2,3,5,6]
解题思路:比较笨拙的方法,从数组的末端开始比较,找到较大值存储在最后面。
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int nums1Index = m-1;
int nums2Index = n-1;
int curIndex = m + n -1;//指向nums1的最后
while(curIndex >= 0){
if(nums1Index < 0){
//nums2数组h剩余是最小的
nums1[curIndex--] = nums2[nums2Index--];
}else if(nums2Index < 0){
//nums1数组还有剩余
nums1[curIndex--] = nums1[nums1Index--];
}else if(nums1[nums1Index] > nums2[nums2Index]){
//nums1的值大
nums1[curIndex--] = nums1[nums1Index--];
}else if(nums1[nums1Index] <= nums2[nums2Index]){
//nums2的值大
nums1[curIndex--] = nums2[nums2Index--];
}
}
}
}
时间: 击败了100.00%
内存: 击败了 99.10%
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
/*参考大佬的代码,写这个代码的时候,在思考先判断n>=0,那当nums2的数组都存储完毕之后,循环结束,剩下的nums1中的数据怎么办?
后来才发现是num1剩下的数据都是在数组最前面,也只剩它们了,数组默认都有序了,不动它就好了,真的是被自己菜到的一天
*/
int curIndex = m + n -1;
m--;
n--;
while(n >= 0){
while(m>=0 && nums1[m] > nums2[n]){
//当输入的nums1还未空并且比当前值更大时,存nums1中的值
nums1[curIndex--] = nums1[m--];
}
//其余情况都是存储nums2的值
nums1[curIndex--] = nums2[n--];
}
}
}
时间: 击败了100.00%
内存: 击败了 59.47%
27.移除元素
题意:
给你一个数组
nums
和一个值val
,你需要 原地 移除所有数值等于val
的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用
O(1)
额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
【输入样例】nums=[3,2,2,3],val=3
【输出样例】2,nums=[2,2]
解题思路:不使用额外的数组空间,O(1)额外空间原地修改数组。
1.引入一个临时变量temp,用于交换数组中两个元素时存储临时数据;
2.引入一个计数变量total,统计数组中共有多少个数据值等于val;
3.定义一个数组尾部指针j,指向数组最后一位;
3.遍历数组,遇到val值时,total++,并利用temp变量将num[i]与num[j]进行交换,注意交换后j--;
class Solution {
public int removeElement(int[] nums, int val) {
int temp;
int total = 0;
int j=nums.length - 1;
for(int i=0;i<=j;i++){
//这里i<=j是因为指针j后面全都是val的值
if(nums[i]==val){
temp = nums[i];
nums[i--] = nums[j];//--是为了方式交换过来的num[j]==val,要再判断一次
nums[j--] = temp;//j--,当前j存的是val
total++;
}
}
return nums.length - total;
}
}
时间: 击败了100.00%
内存: 击败了 89.39%
class Solution {
public int removeElement(int[] nums, int val) {
//继续附上学习的大佬的代码,直接进行覆盖
int j = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != val) {
nums[j++] = nums[i];
}
}
return j;
}
}
时间: 击败了100.00%
内存: 击败了 99.61%