2.插入搜索位置
题目:给定一个排序数组和一个目标值,在数组中找到目标值并且返回索引。如果目标值不在索引中,返回它将会被按顺序插入的值。
输入:[1,2,3,5] 2
输出:1
输入:[1,2,3,5] 4
输出:3
其实这道题本身考的是二分查找。(只要看到题目中给的是顺序数组,就可以考虑二分法)
分析一下有4种情况:(1) target在数组所有元素之前
(2) target等数组中某一元素
(3) target插入数组中的位置
(4) target在数组所有元素之后
方法一:暴力遍历 时间复杂度O(n) 空间复杂度O(1)。其实,只要仔细一想,就能知道只要寻找大于或等于target 的元素下标就可以了,如果遍历整个数组发现都没有满足情况的元素,就返回数组的长度,即插在数组的最后。
class Solution {
public int searchInsert(int[] nums, int target) {
for (int i = 0;i < nums.length;i++)
if( nums[i] >= target){
return i;
}
else if (nums[i] < target){
return nums.length;
}
}
}
方法二:二分查找。确定left、right、middle
middle=(left+right)/2 如果nums[middle]<target,说明目标值在右区间,则left=middle+1;
如果nums[middle]>target,说明目标值在左区间,则right=middle-1
如果nums[middle]=target,则就插入该位置
class Solution { public int searchInsert(int[] nums, int target) {
int left = 0; int right = nums.length - 1;
while(left <= right){
int mid = (left + right) / 2;
if(nums[mid] < target){
left = mid + 1;
}
else if(nums[mid] > target){
right = mid - 1;
}
else if(nums[mid] == target){
return mid;
}
}
return right + 1;
}
}
3.移除元素
题目描述:给定一数组nums,一值val,删除nums中所有值为val的元素
猜想:直接删除值为val的元素不就行了?但是 数组的内存地址空间是连续的,不能单独地删除某个元素,只能覆盖。
方法一:暴力解法
分析一波:假设nums = [1,2,3,5,8,2] vals = 2 主要覆盖过程如图。(题目已经 说明 若返回数组的长度,就会输出这个长度的数组)
nums[0]=1 ≠2 ; nums[1]=2 需要 nums[1]=nums[2] 数组长度减1 n--,数组标减1 i--; nums[2]=5≠2;nums[3]=8≠2;nums[4]=2 没有nums[5] 不过此时只要返回n=4就可以输出 [1,3,5,8]这个数组了
代码如下:
class Solution {
public int removeElement(int[] nums, int val) {
int n = nums.length;
for (int i = 0;i < n;i++){
if (nums[i] == val){
for (int j = i + 1;j < n;j++){
nums[i] = nums[j];
}
n--;
i--;
}
}
return n;
}
}
方法二:双指针法 (一个快指针,一个慢指针)
fastindex = 0; slowindex = 0; nums[0]=1 ≠2;fastindex=1, nums[1]=2,nums[1]=nums[fastindex+1]; .........
代码如下:
class Solution {
public int removeElement(int[] nums, int val) {
int slowindex = 0;
for (int fastindex = 0;fastindex < nums.length;fastindex++){
if(nums[fastindex] != val){
nums[slowindex++] = nums[fastindex];
}
}
return slowindex;
}
}