代码随想录之数组(力扣题号)

news2024/12/25 2:07:07

69 x的平方根

在这里插入图片描述
这题需要注意的点在于数据的数据范围导致计算x的平方可能会超过Integer范围

超出范围之后的大小判断就会出错

 if(2147488281>2147395600) 
 	System.out.println("yes"); 
 	//没有输出   注意不能这样,会超出Integer范围

解决:前面加个(long)就可以

第一思路是暴力遍历

        for(int i=0;i<=x;i++){
            if(i*i<=x&&(long)(i+1)*(i+1)>x) return i;//就可以
        }
       return 0;

最佳方案是二分法

class Solution {
    public int mySqrt(int x) {
        int left = 0;
        int right = x;
        while(left<=right){
            int mid = (left+right)/2;
            if((long)mid*mid==x) return mid;
            else if((long)mid*mid<x) left = mid+1;
            else right = mid-1;
        }
        return left-1;      
    }
}

27 移除元素

在这里插入图片描述
知道用快慢指针还是写了二十几分钟,还是因为代码思路不够清晰,fast和slow分开写,分开自增和赋值判断,弄得很乱。
其实只需要用slow来存去掉后的(判断fast指向的是不是val即可)

class Solution {
    public int removeElement(int[] nums, int val) {
        //58-20
        int slow = 0;
        for(int fast=0;fast<nums.length;fast++){
            if(nums[fast]!=val){
                nums[slow++] = nums[fast];
            }
        }
        return slow;
    }
}

26 删除数组的重复项

在这里插入图片描述

和上题是一样的,把判断的val换成数组中前一个元素即可

class Solution {
    public int removeDuplicates(int[] nums) {
        //32-36
        int slow = 1;
        for(int fast = 1;fast<nums.length;fast++){
            if(nums[fast]!=nums[fast-1]) 
            	nums[slow++]=nums[fast];
        }
        return slow;
    }
}

844 比较含退格的字符串

 bi
这题还是练习StringBuffer的用法

class Solution {
    public boolean backspaceCompare(String s, String t) {
        StringBuffer ss = new StringBuffer();
        StringBuffer tt = new StringBuffer();
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)!='#'){
                ss.append(s.charAt(i));
               // ss.append(Character.toString(s.charAt(i))); 不用将char转成String就可以直接append
            }else if(ss.length()>0){
                ss.deleteCharAt(ss.length()-1);//去掉末尾
            }
        }
        for(int i=0;i<t.length();i++){
            if(t.charAt(i)!='#'){
                tt.append(Character.toString(t.charAt(i)));
            }else if(tt.length()>0){//有可能多个退格
                tt.deleteCharAt(tt.length()-1);//去掉末尾
            }
        }
        //记得要先转成String才能用equals比较
        return ss.toString().equals(tt.toString());
    }
}

977 有序数组的平方

在这里插入图片描述
最简单的思路就是平方之后排序,排序需要O(nlogn)的时间复杂度和O(logn)的额外堆栈空间。
另一个思路是用双指针:
先找到第一个为正数的,两个指针往两边移动,比较平方谁大

class Solution {
    public int[] sortedSquares(int[] nums) {
        if(nums.length==1) return new int[]{nums[0]*nums[0]};//注意特殊判断,否则会数组越界
        int[] res = new int[nums.length];
        int i=0;
        while(i<nums.length&&nums[i]<0) i++; //注意要前面的判断,否则会数组越界
        //找到第一个正数
        int right = i;
        int left = i-1;
        i=0;
        while(left>=0&&right<nums.length){
            if(nums[left]*nums[left]<nums[right]*nums[right]){
                res[i++]=nums[left]*nums[left];
                left--;
            }else{
                res[i++]=nums[right]*nums[right];
                right++;
            }
        }
        while(left>=0){
            res[i++] = nums[left]*nums[left];
            left--;
        }
        while(right<nums.length){
            res[i++]=nums[right]*nums[right];
            right++;
        }
        return res;
        
    }
}

要注意边界判断,防止数组越界!!!!
看了题解还有一种更简洁的方式,也是用双指针,从两边往中间指,这样就不用边界判断!!

class Solution {
    public int[] sortedSquares(int[] nums) {
       //27-35
       int left = 0;
       int right = nums.length-1;
       int[] res = new int[nums.length];
       int i=nums.length-1;
       //从两边往中间就需要从右边开始放,大的放
       while(left<=right){
           if(nums[left]*nums[left]>nums[right]*nums[right]){
               res[i--] = nums[left]*nums[left];
               left++;
           }
           else{
               res[i--] = nums[right]*nums[right];
               right--;
           }       
       }
        return res;      
    }
}

977 长度最小的子数组

在这里插入图片描述
就是数组的滑动窗口(或双指针)右边先移动,满足条件之后左边尝试移动,每次满足条件记录长度即可,时间复杂度O(N),空间复杂度O(1)

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        //59
        int left = 0;
        int sublength = Integer.MAX_VALUE;
        int num = 0;
        for(int right=0;right<nums.length;right++){
            num+=nums[right];
            while(num>=target){
                sublength=Math.min(sublength,right-left+1);
                num-=nums[left++];           
            }         
        }
        return sublength==Integer.MAX_VALUE?0:sublength;

    }
}

904 水果成篮

在这里插入图片描述
需要把题目进行转义:找任意两个数连续最长的长度
还是可以用滑动数组(双指针),但是边界判断要注意,思路清晰但还是写了半个小时

class Solution {
    public int totalFruit(int[] fruits) {
        //00-31 任意两种类型的连续最长
        int len = -2;
        int left = 0;
        int right = 0;
        //特殊情况判断:只有一种类型
        while(right<fruits.length&&fruits[right]==fruits[left]) right++;
        if(right==fruits.length) return fruits.length;
        //否则,将两种类型值存到a b
        int a = fruits[left];
        int b = fruits[right]; //存两种类型

        while(right<fruits.length){
            //在两种之内,right右移
            if(fruits[right]==a||fruits[right]==b){
                len = Math.max(right-left+1,len);
                right++;              
            }else{
                //此时right在第一次出现的第三个数字处
                //left左移动
                int tmp = right-1;//把tmp移到符合条件的最长的最右端点
                while(tmp>=0&&fruits[tmp]==fruits[right-1]) tmp--;
                left = tmp+1;//此时left和right指向的是更新后的新的两个类型
                a = fruits[left];
                b = fruits[right];
            }
        }
        return len;

    }
}

时间复杂度O(N),空间复杂度O(1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/380587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

百度文心大模型开发者斩获CCF BDCI大赛唯一『最佳算法能力奖』

‍2023年2月24日至25日&#xff0c;中国计算机学会&#xff08;CCF&#xff09;主办、苏州市吴江区人民政府支持&#xff0c;苏州市吴江区工信局、吴江区东太湖度假区管理办公室、苏州市吴江区科技局、CCF大数据专家委员会及其他专业委员会等多家组织单位共同承办的大数据与AI领…

在C#中使用互斥量解决多线程访问共享资源的冲突问题

在阿里云上对互斥量的概述&#xff1a;互斥量的获取是完全互斥的&#xff0c;即同一时刻&#xff0c;互斥量只能被一个任务获取。而信号量按照起始的计数值的配置&#xff0c;可以存在多个任务获取同一信号量的情况&#xff0c;直到计数值减为0&#xff0c;则后续任务无法再获取…

王道操作系统课代表 - 考研计算机 第四章 文件管理 究极精华总结笔记

本篇博客是考研期间学习王道课程 传送门 的笔记&#xff0c;以及一整年里对 操作系统 知识点的理解的总结。希望对新一届的计算机考研人提供帮助&#xff01;&#xff01;&#xff01; 关于对 “文件管理” 章节知识点总结的十分全面&#xff0c;涵括了《操作系统》课程里的全部…

Python使用异步线程池实现异步TCP服务器交互

背景&#xff1a; 实现客户端与服务端交互&#xff0c;由于效率原因&#xff0c;要发送与接收异步&#xff0c;提高效率。 需要多线程&#xff0c;本文用线程池管理。 common代码&#xff1a; import pickle import struct import timedef send_msg(conn, data):time.sleep(…

centos7配置静态网络常见问题归纳

系列相似配置与安装软件问题整理与归纳文章目录 安装pymysql库_pymysql库安装_张小鱼༒的博客-CSDN博客 解决pip更新的代码_pip更新代码_张小鱼༒的博客-CSDN博客 python当中的第三方wxPython库的安装解答_pip install wx_张小鱼༒的博客-CSDN博客 spark里面配置jdk后的编程…

MATLAB算法实战应用案例精讲-【优化算法】增强型鲸鱼优化算法(EWOA)(附matlab代码实现)

前言 增强型鲸鱼优化算法(Enhanced Whale Optimization Algorithm,EWOA)是Mohammad H. Nadimi-Shahraki等人于2022年提出的一种改进算法。由于标准的鲸鱼优化算法及其它的改进算法都存在种群多样性低和搜索策略差的问题,因此引入有效的策略来缓解鲸鱼优化算法的这些核心缺点…

Licode—基于webrtc的SFU/MCU实现

1. webrtc浅析webrtc的前世今生、编译方法、行业应用、最佳实践等技术与产业类的文章在网上卷帙浩繁&#xff0c;重复的内容我不再赘述。对我来讲&#xff0c;webrtc的概念可以有三个角度去解释&#xff1a;&#xff08;1&#xff09;.一个W3C和IETF制定的标准&#xff0c;约定…

项目成本管理中的常见误区及解决方案

做过项目的人都明白&#xff0c;项目实施时间一般很长&#xff0c;在实施期间总有很多项目结果不尽人意的问题。要使一个项目取得成功&#xff0c;就要结合很多因素一起才能作用&#xff0c;其中做好项目成本的管理就是最重要的步骤之一&#xff0c;下面列出了常见的项目成本管…

Python进阶-----高阶函数map() 简介和使用

目录 简介&#xff1a; ​编辑 示例&#xff1a; 示例&#xff08;1&#xff09;&#xff1a;输出map()函数返回值&#xff08;迭代器&#xff09;结果 示例&#xff08;2&#xff09;&#xff1a;与循环对比 示例&#xff08;3&#xff09;&#xff1a;字符串转列表 示…

第九届蓝桥杯省赛——7缩位求和

题目&#xff1a;在电子计算机普及以前&#xff0c;人们经常用一个粗略的方法来验算四则运算是否正确。比如&#xff1a;248 * 15 3720把乘数和被乘数分别逐位求和&#xff0c;如果是多位数再逐位求和&#xff0c;直到是1位数&#xff0c;得2 4 8 14 > 1 4 5;1 5 65…

【C++】类与对象(一)

文章目录1、面向过程和面向对象初步认识2、类的引入3、类的定义4、类的访问限定符5、类的作用域6、类的实例化7、计算类对象的大小8、this指针9、 C语言和C实现Stack的对比1、面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题…

算法练习-排序(一)

算法练习-排序(一) 文章目录算法练习-排序(一)1 排序算法1.1 冒泡排序1.1.1代码1.2插入排序1.2.1代码1.3 选择排序1.3.1代码1.4归并排序1.4.1代码1.5 快速排序1.5.1 思路1.5.2 代码2 题目2.1 特殊排序2.1.1 题目2.1.2 题解2.2 数组中的第k个最大元素2.2.1 题目2.2.2 题解2.3 对…

【Linux学习】基础IO——系统调用 | 文件描述符fd | 重定向

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《Linux学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 基础IO&#x1f34e;文件操作&#x1f349;使用C接口进行文件操作&#x1f349;文件操作的系统调…

Ingress

Ingres 目录 文章目录Ingres目录本节实战1、Ingress是什么2、定义1.rules2.Resource3.pathType4.IngressClass5.TLS3、Ingress-controller1.什么是Ingress-controller2.其他ingress-controller控制器FAQ零碎ingress就是借用service实现服务发现机制关于我最后本节实战 无 1、…

MySQL基础(一)SQL分类、导入、SELECT语句,运算符

目录 MySQL安装以及相关工具 SQL分类 导入数据 最基本的SELECT语句 SELECT FROM 列的别名 去除重复行 着重号 查询常数 描述表结构 过滤数据&#xff08;重要&#xff09; 运算符 算数运算符 比较运算符 符号运算符 非符号运算符 逻辑运算符 位运算符 MySQL安…

【C++】继承与多态

目录前言1. 继承1.1 继承的概念1.2 继承的定义1.3 切片赋值1.4 继承中的作用域1.5 派生类的默认成员函数1.6 继承与友元、静态成员1.7 多继承、菱形继承、菱形虚拟继承1.7.1 区分单继承与多继承1.7.2 菱形继承1.7.3 菱形虚拟继承1.7.4 菱形虚拟继承的原理2. 多态2.1 概念2.2 多…

Elasticsearch实战之(商品搜索API实现)

Elasticsearch实战之&#xff08;商品搜索API实现&#xff09; 1、案例介绍 某医药电商H5商城基于Elasticsearch实现商品搜索 2、案例分析 2.1、数据来源 商品库 - 平台运营维护商品库 - 供应商维护 2.2、数据同步 2.2.1、同步双写 写入 MySQL&#xff0c;直接也同步往…

如何使用C2concealer生成随机化的C2 Malleable配置文件

关于C2concealer C2concealer是一款功能强大的命令行工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员可以轻松生成随机化的C2 Malleable配置文件&#xff0c;以便在Cobalt Strike中使用。 工具运行机制 开发人员对Cobalt Strike文档进行了详细的研究&#xff0c;…

【转载】2020融云:基于WebRTC的低延迟视频直播

原文直接访问本文是读书笔记。基于WebRTC的低延迟视频直播 需要学习rtp包的缓存设计,于是找到了这一篇文章rtp包缓存 如何适应直播需求?直播与实时通信的区别 流量更少: RTMP或者HLS主要基于TCP传输,WebRTC是基于UDP的传输, **UDP协议的头小。**TCP为了保证传输质量,因…

Zotero设置毕业论文/中文期刊参考文献格式

大家在使用zotero时很容易遇到的问题&#xff1a; 英文参考文献中有多个作者时出现“等”&#xff0c;而不是用"et al"引文最后面有不需要的DOI号&#xff0c;或者论文链接对于一些期刊分类上会出现OL字样&#xff0c;即[J/OL]作者名为全大写 本文主要解决以上几个…