LeetCode 热题 HOT 100 -- Java 题解

news2024/11/17 8:51:22

LeetCode 热题 HOT 100 --Java 题解

    • 1. 两数之和
    • 2. 两数相加
    • 3. 无重复字符的最长子串
    • 4. 寻找两个正序数组的中位数

1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

解析

使用 Hash 表记录所有已遍历元素及对应的下标,遍历的同时查找满足条件的数字是否已遍历,若找到返回即可。

代码

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> map = new HashMap<>();
        int[] res = new int[0];
        for(int i = 0; i < nums.length; i++){
            if(map.containsKey(target - nums[i])) return new int[]{i, map.get(target - nums[i])};
            map.put(nums[i],i);
        }
        return res;
    }
}

2. 两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例 1:
在这里插入图片描述
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

解析

按位模拟加法,注意循环条件不要忘记进位。

代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        int cur = 0;
        int carry = 0;//进位
        ListNode dummy = new ListNode();
        ListNode helper = dummy;
        while(l1 != null || l2 != null || carry != 0){
            int v1 = l1 == null ? 0 : l1.val;
            int v2 = l2 == null ? 0 : l2.val;
            int sum = v1 + v2 + carry;
            cur = sum % 10;
            carry = sum / 10;
            helper.next = new ListNode(cur);
            helper = helper.next;
            if(l1 != null) l1 = l1.next;
            if(l2 != null) l2 = l2.next;
        }

        return dummy.next;
    }
}

3. 无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

解析

使用一个数组记录每个字符出现次数,在遍历的同时移动窗口左边界,最后返回窗口长度的最大值即可。
注:子串是连续的,子序列是不连续的

代码

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int[] map = new int[128];
        int res = 0;
        // i : 窗口右边界 j : 窗口左边界
        for(int i = 0 , j = 0;i < s.length(); i++){
            map[s.charAt(i)]++;
            while(map[s.charAt(i)] > 1){ //重复
                map[s.charAt(j++)]--;//窗口左移
            }
            res = Math.max(res, i - j + 1);// i - j + 1是窗口的长度
        }

        return res;
    }
}

4. 寻找两个正序数组的中位数

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

算法的时间复杂度应该为 O(log (m+n)) 。

示例 1:

输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:

输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

解析

本题可以抽象为:给定两个数组 A、B,如何找到从小到大排列的第 K 个数字,而中位数存在 K = K -1的下标映射关系

代码

class Solution {
  public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int n = nums1.length + nums2.length;
        if(n % 2 == 0){
            return (findKth(nums1, 0, nums2, 0, n / 2) + findKth(nums1, 0, nums2, 0, n / 2 + 1)) / 2.0;
        }else{
            return findKth(nums1, 0, nums2, 0, n / 2 + 1);
        }
        
    }
    //i: nums1的起始位置 j: nums2的起始位置
    public int findKth(int[] nums1, int i, int[] nums2, int j, int k){
        if( i >= nums1.length) return nums2[j + k - 1];//nums1为空数组
        if( j >= nums2.length) return nums1[i + k - 1];//nums2为空数组
        if(k == 1){
            return Math.min(nums1[i], nums2[j]);
        }
        int midVal1 = (i + k / 2 - 1 < nums1.length) ? nums1[i + k / 2 - 1] : Integer.MAX_VALUE;
        int midVal2 = (j + k / 2 - 1 < nums2.length) ? nums2[j + k / 2 - 1] : Integer.MAX_VALUE;
        if(midVal1 < midVal2){
            return findKth(nums1, i + k / 2, nums2, j , k - k / 2);
        }else{
            return findKth(nums1, i, nums2, j + k / 2 , k - k / 2);
        }        
    }
}

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

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

相关文章

【信管10.3】风险定量分析及应对监控

风险定量分析及应对监控通过前三个过程&#xff0c;我们已经有了风险登记册&#xff0c;也就是一个所有识别出来的风险情况。然后可以通过定性风险分析来进行分类和排序。接下来我们要继续通过定量&#xff0c;也就是数据的手段来继续完善风险登记册。只有有了详尽的风险登记册…

我对KMP算法的简单理解

我对KMP算法的简单理解 前言&#xff1a;字符串匹配问题 问题概述&#xff1a; “字符串A是否为字符串B的子串&#xff1f;如果是&#xff0c;出现在B的什么位置&#xff1f;”这个问题就是字符串匹配问题。字符串A称为模式串(zs)&#xff0c;字符串B称为主串(ss)。 其中&a…

C++ 深入理解模板实现多态思想

文章目录前言一、模板与多态基础1.模板2.多态二、模板实现多态三、实际应用前言 对C/C学习感兴趣的可以看看这篇文章噢&#xff1a;C/C教程 最近有时间&#xff0c;便用WTL写了一个兼具群聊、单聊以及传输文件的聊天软件&#xff0c;过几天应该就能更新到 C/C教程系列 中了 …

EasyGBS+EasyNVS技术方案,如何实现对多现场国标视频平台的统一管理?

一、平台能力 1&#xff09;EasyGBS EasyGBS国标视频云服务平台支持无缝、完整接入内网或者公网的国标设备&#xff0c;在输出上&#xff0c;实现全平台、全终端输出。EasyGBS可将GB/T28181设备/平台推送的PS流转成ES流&#xff0c;并提供RTSP、RTMP、FLV、HLS、WebRTC等多种…

使用shell进行简单操作

目录 1、shell实现乘法表的打印 2、shell判定成绩等级 3、循环创建用户 1、shell实现乘法表的打印 要求&#xff1a;嵌套循环实现9*9乘法表&#xff08;两种方式&#xff09; 创建脚本文件&#xff1a;vim mcl.sh #!/bin/bash ######################### #File name:mcl.s…

idea插件及插件使用方法

CamelCase (下划线转驼峰) 使用快捷键&#xff1a;altshiftu。 按住altshift再不停的按U&#xff0c;会把选中内容的单词的下划线转驼峰转大写等&#xff0c;不停的转换。 Maven Helper Maven助手 安装之后再次打开pom文件&#xff0c;文件左下角会多出一个视图。 切换到"…

软件测试基础(三) 之 软件的生命周期

软件的生命周期一、软件的生命周期简述软件的生命周期中最早可能是客户&#xff0c;可能是产品的一个想法阶段&#xff0c;然后再到后来的一个需求阶段&#xff0c;再到开发人员去进行编码&#xff0c;去进行自己的自测&#xff0c;再提到软件测试人员进行综合测试&#xff0c;…

C语言之初识指针

前言 &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f; c语言初阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:介绍c语言中的新知识—指针有关的知识. 金句分享: ✨知…

大数据舆情监控流程,TOOM大数据舆情监控范围

大数据舆情监控是一种通过大数据技术&#xff0c;分析社会舆情信息&#xff0c;掌握舆情动态的方法。它利用大数据的存储和处理能力&#xff0c;对海量的网络舆情数据进行收集、清洗、分析、呈现&#xff0c;帮助企业和机构了解公众的想法和评价&#xff0c;掌握舆情动态&#…

【正点原子FPGA连载】第三十一章Linux内核定时器实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第三十一章Linux…

【Linux】多线程详解(中)

&#x1f387;Linux&#xff1a; 博客主页&#xff1a;一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 看似不起波澜的日复一日&#xff0c;一定会在某一天让你看见坚持…

哈希表的概念(散列表)

一、基本概念 散列表特点 &#xff1a; 数据元素的关键字与存储地址直接相关 通过哈希函数建立“关键字”与“存储地址”的联系 若不同的关键字通过散列函数映射到同一个值&#xff0c;则称它们为 “同义词” 通过散列函数确定的位置已经存放了其他元素&#xff0c;则称这种…

今日题目分享(两个维度的思考,双指针/动态规划,b站视频讲解)

先直接上连接 941有效的山脉数组 845数组中的最长山脉 2100适合打劫银行的日子. 2420找到所有好下标. 什么是两个维度&#xff1f; 这里是从代码随想录里面学习到的思考方式&#xff0c;开门见山地说&#xff0c;就是两个方面去考虑题目&#xff0c;比如&#xff0c;要求第…

vue前端框架应用案例(二)实现简单的SPA应用

目录路由使用步骤案例效果案例目录结构App.vueAbout.vueHome.vueindex.jsmain.jsindex.html本博客参考尚硅谷官方课程&#xff0c;详细请参考 【尚硅谷bilibili官方】 本博客以vue2作为学习目标&#xff08;请勿混淆v2与v3的代码规范&#xff0c;否则可能出现报错&#xff09…

docker搭建nacos集群

一、先搭建MySQL主从模式 Nacos使用delby作为内嵌数据库&#xff0c;在使用集群作为部署方式时&#xff0c;内嵌数据库无法保持数据同步与数据一致&#xff0c;故一般使用外接MySQL数据库的方式保存配置文件。使用一主一从的方式搭建&#xff0c;实现主从复制与读写分离。 1.…

线缆也可能是静电危害的罪魁祸首?

众所周知&#xff0c;几乎所有的电子元器件都是对静电敏感的&#xff0c;如果处理不当&#xff0c;将恶化元器件的性能&#xff0c;甚至造成彻底损坏。在低温干燥的环境中&#xff0c;极易产生静电&#xff0c;当然静电主要还是通过摩擦产生的。除了我们所熟知的静电产生的原因…

史上最全的测试用例设计方法

目录 前言 等价类划分方法&#xff1a; 边界值分析方法&#xff1a; 错误推测方法 因果图方法 判定表驱动分析方法 总结 前言 今天还是给大家带来一些干货&#xff0c;总结了一下测试用例的设计方法。具体内容太多我总结成了文档&#xff0c;获取方法在文末。这里截取部…

Swagger2Swagger3

一、什么是Swagger swagger是当下比较流行的实时接口文文档生成工具。接口文档是当前前后端分离项目中必不可少的工具&#xff0c;在前后端开发之前&#xff0c;后端要先出接口文档&#xff0c;前端根据接口文档来进行项目的开发&#xff0c;双方开发结束后在进行联调测试。 所…

Python程序设计之 —— 简易学生信息管理系统

大家好&#xff0c;我是 Enovo飞鱼&#xff0c;今天分享一个 Python程序设计之 —— 简易学生信息管理系统 &#xff0c;小白或者正在学习Python的小伙伴推荐阅读&#xff0c;加油&#x1f4aa;。 目录 前言 Python 简介 Python 特点 一、项目来源及背景 二、功能设计 …

PTA L1-023 输出GPLT(详解)

前言&#xff1a;本期是关于输出GPLT的详解&#xff0c;内容包括四大模块&#xff1a;题目&#xff0c;代码实现&#xff0c;大致思路&#xff0c;代码解读&#xff0c;今天你c了吗&#xff1f; 题目&#xff1a; 给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字…