leetCode刷题记录2

news2024/11/27 10:34:30

文章目录

    • hot100题
      • 560. 和为 K 的子数组
      • 581. 最短无序连续子数组 ▲
      • 617. 合并二叉树

hot100题

560. 和为 K 的子数组

560. 和为 K 的子数组

  • 先暴力,过了再说
public int subarraySum(int[] nums, int k) {
    int ans = 0;
    for (int i = 0; i < nums.length; i++) {
        int sum = 0;
        for (int j = i; j < nums.length; j++) {
            sum += nums[j];
            if(sum==k) ans++;
        }
    }
    return ans;
}

想想之前遍历树时遇到过这个问题,当时用前缀和+Map做得,飞快呀,这里不也可以么

在这里插入图片描述

果然可以,快了不是一点点啊

public int subarraySum(int[] nums, int k) {
    HashMap<Integer, Integer> hash = new HashMap<>();
    hash.put(0,1);//初始化 很重要
    int ans = 0,sum=0;
    for (int i = 0; i < nums.length; i++) {
        sum += nums[i];
        ans += hash.getOrDefault(sum-k,0);// root-A-current   root~current=sum   root~A=sum-k 那么 A~current一定是k
        hash.put(sum,hash.getOrDefault(sum,0)+1);
    }
    return ans;
}

这么写,会快2~3ms

public int subarraySum(int[] nums, int k) {
    HashMap<Integer, Integer> hash = new HashMap<>();
    hash.put(0,1);//初始化 很重要
    int ans = 0,sum=0;
    for (int num : nums) {
        sum += num;
        if(hash.containsKey(sum-k))  ans += hash.get(sum - k);
        if(hash.containsKey(sum)){
            hash.put(sum,hash.get(sum)+1);
        }else {
            hash.put(sum,1);
        }
    }
    return ans;
}

581. 最短无序连续子数组 ▲

581. 最短无序连续子数组

  • 老规矩,先暴力通过再说
public int findUnsortedSubarray(int[] nums) {
    int l=-1,r=-1;
    for (int i = 0; i < nums.length; i++) {
        for (int j = i + 1; j < nums.length; j++) {
            if (nums[j] < nums[i]){//正序遍历 第一个不满足升序的
                l = i;
                break;
            }
        }
        if(l!=-1) break;
    }

    for (int i = nums.length - 1; i >= 0; i--) {
        for (int j = i-1; j >= 0; j--) {
            if (nums[j] > nums[i]){//逆序遍历 第一个不满足降序的
                r = i;
                break;
            }
        }
        if(r!=-1) break;
    }
    return l<r?r-l+1:0;
}

或者排序后比较前最长前缀和最长后缀

public int findUnsortedSubarray(int[] nums) {
    HashMap<Integer, Integer> map = new HashMap<>();
    int[] sort = Arrays.copyOf(nums, nums.length);
    Arrays.sort(sort);
    int l=0,r=nums.length-1;
    while (l<nums.length&&nums[l]==sort[l]) l++;
    while (r>0&&nums[r]==sort[r]) r--;
    return l<r?r-l+1:0;
}

竟然才7ms,也挺快的呀

  • 方法1想法不错 但其实实现没那么麻烦

left应该小于右边所有元素 为何非要从前往后遍历呢,从后往前遍历 其实一趟就够了呀
同样right是后面都比它大 也可以从前往后一趟遍历

在这里插入图片描述

public int findUnsortedSubarray(int[] nums) {
    // 想法不错 但其实实现没那么麻烦
    // left应该小于右边所有元素 为何非要从前往后遍历呢,从后往前遍历 其实一趟就够了呀
    int min = Integer.MAX_VALUE, minI = -1;
    for (int i = nums.length-1; i >= 0; i--) {
        if(nums[i]>min) {
            minI=i;
        }else {
            min = nums[i];
        }
    }

    // 同样right是后面都比它大 也可以从前往后一趟遍历
    int max = Integer.MIN_VALUE, maxI=-2;
    for (int i = 0; i < nums.length; i++) {
        if(nums[i]<max) {
            maxI = i;
        }else {
            max = nums[i];
        }
    }

    return minI<maxI?maxI-minI+1:0;
}

当然两次遍历可以优化为1次遍历

public int findUnsortedSubarray(int[] nums) {
    // 想法不错 但其实实现没那么麻烦
    // left应该小于右边所有元素 为何非要从前往后遍历呢,从后往前遍历 其实一趟就够了呀   right也是
    int min = Integer.MAX_VALUE, minI = -1;
    int max = Integer.MIN_VALUE, maxI = -2;
    int n = nums.length;
    for (int i = n - 1; i >= 0; i--) {
        if (nums[i] > min) minI = i;
        else min = nums[i];

        if (nums[n - 1 - i] < max) maxI = n - 1 - i;
        else max = nums[n - 1 - i];
    }
    return minI < maxI ? maxI - minI + 1 : 0;
}

617. 合并二叉树

617. 合并二叉树

同步遍历,但是得先验证,后验的话root=null->root=new TreeNode() 连不起来

0ms 时间效率还不错

public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
    if(root1==null) return root2;
    if(root2==null) return root1;//开始根就为null的特判

    root1.val += root2.val;

    //System.out.printf("(%d %d)", root1 == null ? -1 : root1.val, root2 == null ? -1 : root2.val);

    if (root1.left != null || root2.left != null) {
        if (root1.left == null) root1.left = new TreeNode(0);
        else if (root2.left == null) root2.left = new TreeNode(0);
        mergeTrees(root1.left, root2.left);
    }

    if (root1.right != null || root2.right != null) {
        if (root1.right == null) root1.right = new TreeNode(0);
        else if (root2.right == null) root2.right = new TreeNode(0);
        mergeTrees(root1.right, root2.right);
    }

    return root1;
}
  • 其实宏观层面看递归,巧用返回值,代码非常优美
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
    if(root1==null) return root2;
    if(root2==null) return root1;

    TreeNode merge = new TreeNode(root1.val+root2.val);
    merge.left = mergeTrees(root1.left,root2.left);
    merge.right = mergeTrees(root1.right,root2.right);

    return merge;
}

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

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

相关文章

保姆级教程Windows11下安装RocketMQ

一、RocketMQ介绍 RocketMQ 是阿里巴巴开源的分布式消息中间件。支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。它里面有几个区别于标准消息中件间的概念&#xff0c;如Group、Topic、Queue等。系统组成则由Producer、Consumer、Broker、NameServer等。 二、Rock…

vector类详解【c++】

&#x1f600;博主主页 &#x1f600;博主码云 目录 &#x1f3c5;vector简介&#x1f3c5;vector使用&#x1f3c6;vector的定义&#x1f3c6;vector iterator 的使用&#x1f3c6;vector 空间函数&#x1f3c6;vector的扩容问题&#x1f3c6;vector 增删查改&#x1f3c6;vec…

Python tkintertools 模块介绍(新版)

&#x1f680;tkintertools&#x1f680; The tkintertools module is an auxiliary module of the tkinter module tkintertools 模块是 tkinter 模块的辅助模块 Installation/模块安装 Stable version/稳定版本 Version/版本 : 2.6.1Release Date/发布日期 : 2023/05/21 p…

Edge 浏览器:隐藏功能揭秘与高效插件推荐

文章目录 一、前言二、Edge 的各种奇淫巧计2.1 开启 Edge 分屏功能2.2 启动 Edge 浏览器后直接恢复上次关闭前的页面2.3 解决 Edge 浏览器无法同步账号内容2.4 开启垂直标签页&#xff08;推荐&#xff09;2.5 设置标签分组&#xff08;推荐&#xff09;2.6 设置标签睡眠时间&a…

网络管理 - 简单网络管理协议 SNMP

文章目录 1 概述1.1 结构1.2 操作 2 SNMP2.1 报文格式2.2 五大报文类型2.3 三大组件 3 扩展3.1 网工软考真题 1 概述 #mermaid-svg-xmaaQjpp1bT1axfw {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-xmaaQjpp1bT1axf…

实验篇(7.2) 01. 实验环境介绍 远程访问 ❀ Fortinet网络安全专家 NSE4

【简介】学习NSE4&#xff0c;如果只看文章而不动手做实验&#xff0c;就象耍流氓。为了有效的巩固学习到的内容&#xff0c;建议经常动手做实验。实验不怕出错&#xff0c;身经百战后&#xff0c;再在生产环境部署和配置FortiGate防火墙&#xff0c;就会做到胸有成竹。 虚拟实…

【网络协议详解】——RIP协议(学习笔记)

目录 &#x1f552; 1. IP路由协议概述&#x1f558; 1.1 路由表&#x1f558; 1.2 路由的度量尺度/度量值&#x1f558; 1.3 路由管理距离 &#x1f552; 2. RIP协议&#x1f558; 2.1 概述&#x1f558; 2.2 工作原理 &#x1f552; 3. 报文格式&#x1f558; 3.1 RIP 协议报…

【自动化测试】第一次项目实施

测试项目简介&#xff1a;基于python语言 跨平台的测试自动化工具&#xff0c;适用于后台、原生或混合型客户端应用的测试。它支持 Android、iOS、Web、后台、云服务和 Windows 端的 UI 自动化测试。 上手快&#xff0c;操作简单&#xff0c;只要有一点python基础&#xff0c…

5. 多线程并发锁

本文介绍了多线程并发下为了避免临界资源被抢占而出现的错误&#xff0c;引入了锁和原子操作 来解决。 一、问题分析 创建10个线程&#xff0c;每个线程实现往总进程加1万个数。则总进程会达到10万 #include<stdio.h> #include <unistd.h> #include<pthread.h…

路径规划算法:基于头脑风暴算法的路径规划算法- 附代码

路径规划算法&#xff1a;基于头脑风暴的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于头脑风暴的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法头脑…

强化学习-初步认识

前言 强化学习这个概念是2017年Alpha Go战胜了当时世界排名第一的柯洁而被大众知道&#xff0c;后面随着强化学习在各大游戏比如王者荣耀中被应用&#xff0c;而被越来越多人熟知。王者荣耀AI团队&#xff0c;甚至在顶级期刊AAAI上发表过强化学习在王者荣耀中应用的论文。 什么…

BEVDet4D 论文学习

1. 解决了什么问题&#xff1f; 单帧数据包含的信息很有限&#xff0c;制约了目前基于视觉的多相机 3D 目标检测方法的性能&#xff0c;尤其是关于速度预测任务&#xff0c;要远落后于基于 LiDAR 和 radar 的方法。 2. 提出了什么方法&#xff1f; BEVDet4D 将 BEVDet 方法从…

C++ Vecter

C Vecter &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容讲解了C中vector的介绍以及相关的一些接口的使用 …

Prometheus+Grafana监控系统

一、简介 1、Prometheus简介 官网&#xff1a;https://prometheus.io 项目代码&#xff1a;https://github.com/prometheus Prometheus&#xff08;普罗米修斯&#xff09;是一个最初在SoundCloud上构建的监控系统。自2012年成为社区开源项目&#xff0c;拥有非常活跃的开发人员…

第二章 Electron自定义界面(最大化、最小化、关闭、图标等等)

一、介绍 &#x1f606; &#x1f601; &#x1f609; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需…

linux--systemd、systemctl

linux--systemd、systemctl 1 介绍1.1 发展sysvinitupstart主角 systemd 登场 1.2 简介 2 优点兼容性启动速度systemd 提供按需启动能力采用 linux 的 cgroups 跟踪和管理进程的生命周期启动挂载点和自动挂载的管理实现事务性依赖关系管理日志服务systemd journal 的优点如下&a…

GAMS建模技术案例01 求解简单的线性规划模型

目录 1.问题描述 2 GAMS代码要点 2.1 代码编写要点 2.2 案例源码 2.3 计算结果及报告解 1.问题描述 首先给出一个基本线性规划问题的计算案例 subject to: 2 GAMS代码要点 2.1 代码编写要点 使用 * 表示注释文本定义变量 Positive Variable 表示定义非负变量Negative V…

【经典论文】打通文本图像的里程碑--clip

Git&#xff5c;Paper&#xff5c;Colab&#xff5c; CLIP 论文逐段精读【论文精读】_哔哩哔哩_bilibili clip是openai团队在4亿对文本图像对上训练出来的。它的训练方法简单&#xff0c;但效果缺出奇的好。是打通图片文本的里程碑式的模型。 目录 一.模型结构​编辑 1.为…

“Shell“免交互

文章目录 一.免交互&#xff08;Here Document&#xff09;1.1Here Document 概述2.2Here Document 常规用法 二.Expect2.1Expect基本命令2.2Expect执行方式 一.免交互&#xff08;Here Document&#xff09; 1.1Here Document 概述 使用I/O重定向的方式将命今列表提供给交互式…

chatgpt赋能Python-pythonandor

Pythonandor&#xff1a;探索Python的异步编程方式 如果您是一个Python工程师&#xff0c;你可能已经听过Pythonandor。Pythonandor是一个Python异步框架&#xff0c;能够让你更高效地处理请求&#xff0c;并且提高应用程序的响应速度。 什么是Pythonandor? Pythonandor实际…