代码随想录二刷day01

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • [一、704. 二分查找](#一、704. 二分查找)
  • [二、35. 搜索插入位置](#二、35. 搜索插入位置)
  • [三、34. 在排序数组中查找元素的第一个和最后一个位置](#三、34. 在排序数组中查找元素的第一个和最后一个位置)
  • [四、69. x 的平方根](#四、69. x 的平方根)
  • [五、367. 有效的完全平方数](#五、367. 有效的完全平方数)
  • [六、27. 移除元素](#六、27. 移除元素)
  • [七、26. 删除有序数组中的重复项](#七、26. 删除有序数组中的重复项)
  • [八、283. 移动零](#八、283. 移动零)
  • [九、844. 比较含退格的字符串](#九、844. 比较含退格的字符串)
  • [十、977. 有序数组的平方](#十、977. 有序数组的平方)

前言

使用左闭右闭区间的二分查找时, 最后low一定是被查找元素的插入位置,若查找的数带小数,low-1, 便是最终结果

一、704. 二分查找

1、左闭右闭

java 复制代码
class Solution {
    public int search(int[] nums, int target) {
        int low = 0, high = nums.length-1, mid = 0;
        while(low <= high){
            mid = (low + high)/2;
            if(nums[mid] == target){
                return mid;
            }else if(nums[mid] < target){
                low = mid + 1;
            }else{
                high = mid - 1;
            }
        }
        return -1;
    }
}

2、左闭右开

java 复制代码
class Solution {
    public int search(int[] nums, int target) {
        int low = 0, high = nums.length, mid = 0;
        while(low < high){
            mid = (low + high)/2;
            if(nums[mid] == target){
                return mid;
            }else if(nums[mid] < target){
                low = mid + 1;
            }else{
                high = mid;
            }
        }
        return -1;
    }
}

二、35. 搜索插入位置

java 复制代码
class Solution {
    public int searchInsert(int[] nums, int target) {
        int low = 0, high = nums.length, mid;
        while(low < high){
            mid = (low + high)/2;
            if(nums[mid] == target){
                return mid;
            }else if(nums[mid] < target){
                low = mid + 1;
            }else{
                high = mid;
            }
        }
        return low;
    }
}

三、34. 在排序数组中查找元素的第一个和最后一个位置

java 复制代码
class Solution {
    public int[] searchRange(int[] nums, int target) {
        int low = 0, high = nums.length, mid; int[] res = {-1, -1};
        while(low < high){
            mid = (low + high)/2;
            if(nums[mid] == target){
                res[0] = res[1] = mid;
                while(res[0]-1 >= 0 && nums[res[0] - 1] == target){
                    res[0] -= 1;
                }
                while(res[1] + 1 < nums.length && nums[res[1] + 1] == target){
                    res[1] += 1;
                }
                return res;
            }else if(nums[mid] < target){
                low = mid + 1;
            }else{
                high = mid;
            }
        }
        return res;
    }
}

四、69. x 的平方根

java 复制代码
class Solution {
    public int mySqrt(int x) {
        int low = 0, high = x, mid;
        if(x == 0 || x == 1){
            return x;
        }
        while(low <= high){
            mid = (low + high)/2;
            if(x / mid == mid){
                return mid;
            }else if(x / mid > mid){
                low = mid +1;
            }else{
                high = mid -1;
            }
        }
        return low - 1;
    }
}

五、367. 有效的完全平方数

java 复制代码
lass Solution {
    public boolean isPerfectSquare(int num) {
        int x = 1;
        while(num > 0){
            num -= x;
            x += 2;
        }
        return num == 0;
    }
}

六、27. 移除元素

java 复制代码
class Solution {
    public int removeElement(int[] nums, int val) {
        int i = 0, j = 0;
        for(;i < nums.length; ){
            if(nums[i] != val){
                nums[j] = nums[i];
                i ++; j ++;
            }else{
                i ++;
            }
        }
        return j;
    }
}

七、26. 删除有序数组中的重复项

java 复制代码
class Solution {
    public int removeDuplicates(int[] nums) {
        if(nums.length == 1){
            return 1;
        }
        int i = 1, j = 0;
        for(; i < nums.length; ){
            if(nums[i] != nums[j]){
                nums[++j] = nums[i++];
            }else{
                i ++;
            }
        }
        return j + 1;
    }
}

八、283. 移动零

java 复制代码
class Solution {
    public void moveZeroes(int[] nums) {
        int i = 0, j = 0, len = nums.length;
        if(len == 1)return;
        while(i < len){
            if(nums[i] != 0){
                nums[j] = nums[i];
                if(i == j){
                    i ++;
                }else{
                    nums[i++] = 0;
                }
                j ++;
            }else{
                i ++;
            }
        }
    }
}

九、844. 比较含退格的字符串

java 复制代码
class Solution {
    public boolean backspaceCompare(String s, String t) {
        Deque<Character> deq1 = new ArrayDeque<>();
        Deque<Character> deq2 = new ArrayDeque<>();
        char[] ch1 = s.toCharArray();
        char[] ch2 = t.toCharArray();
        for(int i = 0; i < ch1.length; i ++){
            if(ch1[i] != '#'){
                deq1.offerFirst(ch1[i]);
            }else if(!deq1.isEmpty()){
                deq1.pollFirst();
            }
        }
        for(int j = 0; j < ch2.length; j ++){
            if(ch2[j] != '#'){
                deq2.offerFirst(ch2[j]);
            }else if(!deq2.isEmpty()){
                deq2.pollFirst();
            }
        }
        while(!deq1.isEmpty() && !deq2.isEmpty()){
            char c1 = deq1.pollFirst();
            char c2 = deq2.pollFirst();
            if(c1 != c2){
                return false;
            }
        }
        return deq1.isEmpty() && deq2.isEmpty();
    }
}

十、977. 有序数组的平方

java 复制代码
class Solution {
    public int[] sortedSquares(int[] nums) {
        Deque<Integer> deq1 = new LinkedList<>();
        Deque<Integer> deq2 = new LinkedList<>();
        for(int i = 0; i < nums.length; i ++){
            if(nums[i] <= 0){
                deq1.offerLast(nums[i] * nums[i]);
            }else{
                deq2.offerLast(nums[i] * nums[i]);
            }
        }
        int k = 0;
        while(!deq1.isEmpty() && !deq2.isEmpty()){
            if(deq1.peekLast() <= deq2.peekFirst()){
                nums[k ++] = deq1.pollLast();
            }else{
                nums[k ++] = deq2.pollFirst();
            }
        }
        while(!deq1.isEmpty()){
            nums[k ++] = deq1.pollLast();
        }
        while(!deq2.isEmpty()){
            nums[k ++] = deq2.pollFirst();
        }
        return nums;
    }
}
相关推荐
AI进化营-智能译站1 小时前
ROS2 C++开发系列17-多线程驱动多传感器|chrono高精度计时实现机器人同步控制
java·c++·ai·机器人
一切皆是因缘际会5 小时前
从概率拟合到内生心智:2026 下一代 AI 架构演进与落地实践
人工智能·深度学习·算法·架构
Java成神之路-5 小时前
【LeetCode 刷题笔记】34. 在排序数组中查找元素的第一个和最后一个位置 | 二分查找经典刷题题解
算法·leetcode
qq_589568105 小时前
springbootweb案例,出现访问 http://localhost:8080/list 一直处于浏览器运转阶段
java·网络协议·http·list·springboot
不忘不弃5 小时前
用BFS方法求解平分汽油问题
算法·宽度优先
AI科技星5 小时前
全域数学·72分册·射影原本 无穷维射影几何卷细化子目录【乖乖数学】
人工智能·线性代数·算法·机器学习·数学建模·数据挖掘·量子计算
风落无尘5 小时前
《智能重生:从垃圾堆到AI工程师》——第四章 变化的艺术
人工智能·线性代数·算法
JAVA面经实录9175 小时前
计算机基础(完整版·超详细可背诵)
java·linux·数据结构·算法
AC赳赳老秦5 小时前
知识产权辅助:用 OpenClaw 批量生成专利交底书 / 软著申请材料,自动校验格式与内容合规性
java·人工智能·python·算法·elasticsearch·deepseek·openclaw
WBluuue6 小时前
Codeforces 1093 Div2(ABCD1D2)
c++·算法