2021-06-01

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;

    }

}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值