day1 |704.二分查找、27.移除元素

题目链接:704. 二分查找 - 力扣(LeetCode)

题目描述:

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

代码:

class Solution {
    public int search(int[] nums, int target) {
        int low=0, high=nums.length-1;        
        while(low<=high){
            int mid = (low+high)/2;
       //用这个写法可能会造成浮点数溢出,详见:代码随想录算法训练营第一天 | 704. 二分查找、27. 移除元素_方可申别翘二郎腿的博客-CSDN博客 if(target>nums[mid]){ low=mid+1; } if(target<nums[mid]){ high=mid-1; } if(target==nums[mid]){ return mid; } } return -1; } }

刚开始while条件中写的条件是 low!=high 这样会造成错误:nums数组中只有一个元素时会查找错误。

 

题目链接:27. 移除元素 - 力扣(LeetCode)

题目描述:

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

代码:

方法一:暴力求解法

时间复杂度:O(n^2)

 1 class Solution {
 2     public int removeElement(int[] nums, int val) {
 3         int len=nums.length;
 4         for(int i=0;i<len;i++){
 5             if(nums[i]==val){
 6                 for(int j=i+1;j<len;j++){
 7                     nums[j-1]=nums[j];
 8                 }
 9                 i--;
10                 len--;
11             }
12         }
13         return len;
14     }
15 }

方法二:双指针(定义快慢指针)

 时间复杂度:O(n)

快指针:查找旧数组中等于val的元素。

慢指针:更新新数组中的元素。

代码思路:数组中不等于val的值也是新数组中的元素,所以慢指针所指的元素就等于快指针所指的元素,如果快指针遇到val值,则不更新新数组,快指针继续往下走。

 1 class Solution {
 2     public int removeElement(int[] nums, int val) {
 3         int slow=0;
 4         for(int i=0;i<nums.length;i++){
 5             if(nums[i]!=val){
 6                 nums[slow]=nums[i];
 7                 slow++;
 8             }
 9         }
10         return slow;
11     }
12 }

 参考文章:代码随想录 (programmercarl.com)

posted @ 2023-01-11 22:11  Inbreak  阅读(39)  评论(0)    收藏  举报