移除元素
问题描述
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
解题思想
这题与昨天的题(删除排序数组中的重复项)是同类型的题,所以依然可以使用双指针来解题,只是注意这里的两个指针都是从0号位置开始的。
还有两个注意点,已在代码中标明:
class Solution {
public int removeElement(int[] nums, int val) {
int n = nums.length;
if(n == 0) return 0;
int i = 0;
for(int j=0;j<n;j++){
if(nums[j] != val)
nums[i++] = nums[j]; //注意:这里只能用i++,不能用++i;
}
return i;//返回的是i,不是i+1
}
}
时间复杂度:O(n)
空间复杂度:O(1)
搜索插入位置
问题描述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
解题思想
这是一个简单题,直接遍历,时间复杂度O(n)可以解决,但考点不是这个,所以就往二分查找方向想,时间复杂度能优化到O(logn)。
代码:
class Solution {
public int searchInsert(int[] nums, int target) {
int n = nums.length;
int left = 0, right = n - 1, res = n;
while (left <= right) {
int mid = (left+right)/2;
if (target <= nums[mid]) {
res = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return res;
}
}
时间复杂度:O(logn)
空间复杂度:O(1)