首页 > 其他分享 >代码随想录刷题记录第一天 | 数组 | 704. 二分查找,27. 移除元素

代码随想录刷题记录第一天 | 数组 | 704. 二分查找,27. 移除元素

时间:2024-03-20 16:56:30浏览次数:28  
标签:right nums int 随想录 mid 27 数组 移除 left

题目链接:
704. 二分查找 - https://leetcode.cn/problems/binary-search/description/
27. 移除元素 - https://leetcode.cn/problems/remove-element/description/

文章学习链接:https://programmercarl.com/数组理论基础.html
视频学习链接:https://www.bilibili.com/video/BV1fA4y1o715

704. 二分查找

思路:由题意的,是二分查找,所以直接使用了二分查找的方法。

二分查找

使用条件

  • 用于查找的内容逻辑上来说是需要有序的

  • 查找的数量只能是一个,而不是多个(多个返回结果可能不一样)

步骤:
确定一个左边界,一个右边界,判断要求的值是否在范围内,如果不在,是大于目标值还是小于目标值,然后以此调节范围

解答代码

class Solution {
     public int search(int[] nums, int target) {
        // 判断数组非空 和 简单的范围判断(因为有序)
        if(nums == null || target > nums[nums.length -1] || target < nums[0]){
            return -1;
        }
        // 给定初值边界
        int left = 0;
        int right = nums.length;
        int mid ;
        // 当左边大于右边,跳出循环
        while(left < right){ 
            mid = (right + left)/2;
            if(nums[mid] == target){
                return mid;
            }
            if(nums[mid] > target){  // target 在左区间,在[left, middle)中
                right = mid;
                continue;
            }
            if(nums[mid] < target){ // target 在右区间,在[middle + 1, right)中
                left = mid +1 ;
                continue;
            }
        }
        return -1;
    }
}

出现的问题:
一开始超出时间限制了嘞 >.<

注意点:
1、mid = (right + left)/2 是加,不是减,是求两个点之间的中值
2、left = mid + 1 那里和 right = mid 区别

二分法有两种写法
一种取值是left、right是闭区间的,即left和right都在数组内,[left,right]
一种取值是left、right是左闭右开,即[left,right)

当选择第二种时注意,让right一直处于开区间的那,(由第二个注意点那里保证)。


27. 移除元素

思路:暴力破解,双指针法

1、暴力破解

步骤:逐个匹配,当匹配到和给定的val值一样的时候,将后面的元素都往前提一个元素。两层for循环,一个for循环遍历数组元素 ,第二个for循环更新数组。

代码:

class Solution {
    public int removeElement(int[] nums, int val) {
        int target = 0; //记录val值的个数
        int len = nums.length; // 原数组长度
        for(int i = 0 ; i< len;i++){ //i<len 最大可到 len - 1 (原数组最大下标)
            if(nums[i] == val){ //等于则将后面的元素都往前移
                for(int j = i; j< len - 1; j++){ // j<len-1 最大可到 len - 2 ,防止j+1下标越界,当进入到这里面的时候也只少会有一个val 
                    nums[j] = nums[j+1]; 
                }
                target++; 
                i--; // 为了判断前移的第一个元素是否等于val 
            }
            if(i == len - target - 1){ // 当长度到len - target - 1 就不用判断了
                break;
            }
        }
        return len - target;
    }
}

注意点
1、匹配时候同时出现两个val值连在一起时
2、给定的数组只要一个元素或是没有元素的时候

2、双指针法

双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。

步骤:
定义快慢指针
快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
慢指针:指向更新 新数组下标的位置

class Solution {
    public int removeElement(int[] nums, int val) {
       int slowIndex = 0;
       for(int fastIndex = 0,len = nums.length;fastIndex < len;fastIndex++){
            if(nums[fastIndex] != val){
                nums[slowIndex] = nums[fastIndex];
                slowIndex++;
            }
       }
       return slowIndex;
    }
}

或者相向,(题目提示说可以无序)


收获

复习了双指针法

很久之前写过,以为重写应该会很简单,结果都没有一次写出来

ps:一刷以完成题目为标准,除了指定说要学的方法,多做题,各种解题思路等二刷再去一个个看

标签:right,nums,int,随想录,mid,27,数组,移除,left
From: https://www.cnblogs.com/slothion/p/18085605

相关文章

  • 代码随想录算法训练营第十三天|239. 滑动窗口最大值、347.前 K 个高频元素、总结
    题目:239.滑动窗口最大值文章链接:代码随想录视频链接:LeetCode:239.滑动窗口最大值题目链接:力扣题目链接图释:classSolution{public://自己定义一个优先队列classMyQueue{public: deque<int>deq; //弹出 voidpop(intvalue){ //当输入的数组与队顶......
  • 代码随想录算法训练营第十一天| 20. 有效的括号、1047. 删除字符串中的所有相邻重复项
    题目:20.有效的括号文章链接:代码随想录视频链接:LeetCode:20.有效的括号题目链接:力扣题目链接图释:classSolution{public://有效的括号boolisValid(strings){ //遇到左括号时就放入右括号,遇到右括号时,与栈内的顶元素进行比较 //情况一:与栈顶元素相等,则是t......
  • 代码随想录算法训练营第五十二天 | 718. 最长重复子数组 ,674. 最长连续递增序列,300.最
    300.最长递增子序列 已解答中等 相关标签相关企业 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] ......
  • 代码随想录 第二十四天| ●回溯 理论基础 ● 77. 组合
    回溯理论基础:回溯三部曲:制定回溯函数的参数和返回值确定回溯终止条件确定回溯遍历过程 回溯模板voidbacktracking(参数){if(终止条件){存放结果;return;}for(选择:本层集合中元素(树中节点孩......
  • 【代码随想录】深度优先搜索
    首先了解一下深度优先搜索和回溯法的区别可以看出这两种方法在思路上可以说没什么区别,但是由于在具体实现方面的区别,有着不同的应用场景。我的理解是,回溯法很多时候是应用在抽象的枚举过程中的,而dfs算法很多时候是用在图或者树这种实际的几何图形中的。比较一下回溯的模版和df......
  • B3927 [GESP202312 四级]小杨的字典(入门小白版)
    本题包括:1.简单的map使用2.字符串简单处理本题参考洛谷题解: https://www.luogu.com.cn/problem/solution/B3927难度:普及-对于笔者而言:不会用map,在b站和csdn上搜map的使用方法,只能说是杂而乱杂在于:介绍的种类方法多种多样,但是底下的使用方法寥寥无几,与开头的介绍有......
  • 代码随想录算法训练营第十五天| 226. 翻转二叉树 101. 对称二叉树
    226.翻转二叉树https://leetcode.cn/problems/invert-binary-tree/description/publicTreeNodeinvertTree(TreeNoderoot){invert(root);returnroot;}publicvoidinvert(TreeNodenode){if(node==null)return;TreeNod......
  • Programming Abstractions in C阅读笔记:p327-p330
    《ProgrammingAbstractionsinC》学习第78天,p327-p330,总计4页。一、技术总结1.ADT(抽象数据类型)p328,Atypedefinedintermofitsbehaviorratherthanitsrepresnetationiscalledanabstractdatatype(如果一种数据类型使用它们的行为而不是表示来定义,那么这样的......
  • 代码随想录算法训练营day28 | leetcode 93. 复原 IP 地址、78. 子集、90. 子集 II
    目录题目链接:93.复原IP地址-中等题目链接:78.子集-中等题目链接:90.子集II-中等题目链接:93.复原IP地址-中等题目描述:有效IP地址正好由四个整数(每个整数位于0到255之间组成,且不能含有前导0),整数之间用'.'分隔。例如:"0.1.2.201"和"192.168.1.1"是有效IP......
  • [SCOI2011][洛谷P3275] 糖果
    本来这是一道差分约束板子题/水题SPFA-BFS和SPFA-DFS都能过BFS#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constllN=100005;#definemax(a,b)((a)>(b)?(a):(b))#definemin(a,b)((a)<(b)?(a):(b))structedge{ intto,next,w;}e[N*1000]......