力扣hot100刷题第一天

哈希

1. 两数之和

题目

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案。
在这里插入图片描述题意:从给定数组中找到两个数的和为target,返回这两个数的下标
思路:使用哈希表存储数和对应下标,遍历的同时进行寻找

代码

class Solution {
public int[] twoSum(int[] nums, int target) {
int n = nums.length;
Map<Integer,Integer> map = new HashMap<>();
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 null;
}

49.字母异位词分组

题目

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
在这里插入图片描述题意:给定一系列字符串,将组成相同顺序不同的字符串放在一起并返回
思路:构建异位词的key,将相同元素放在哈希表的同一个key下,然后把哈希表的values返回

代码

class Solution {
public List<List> groupAnagrams(String[] strs) {
Map<String, List> map = new HashMap<>();
for (String str : strs) {
int n = str.length();
char[] chars = str.toCharArray();
Arrays.sort(chars);
String key = new String(chars);
List e = map.getOrDefault(key, new ArrayList<>());
e.add(str);
map.put(key, e);
}
return map.values().stream().toList();
}
}

128. 最长连续序列

题目

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
在这里插入图片描述题意:给定数组,找出最长连续序列的长度,如5,6,7…
思路:使用set存储所有的数,然后遍历所有的数,每一次循环,检查是否存在比当前数更小的值,如果存在,直接跳过,如果不存在,则开始统计。

代码

class Solution {
public int longestConsecutive(int[] nums) {
if (nums.length == 0) return 0;
Set set = new HashSet<>();
for (int num : nums) {
set.add(num);
}
int longest = 1;
for (Integer num : set) {
if (set.contains(num - 1)) continue;//如果 set 中存在 num - 1,则跳过当前元素(这意味着当前元素不是某个连续序列的起点)。
int curLongest = 1;
while (set.contains(++num)) {
curLongest++;
longest = Math.max(longest, curLongest);
}
}
return longest;
}
}

双指针

283.移动零

题目

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
题意:将非0的数前移,其他位置置0
思路:双指针,将非0的数移动到前指针位置,结束遍历后全部填充0

代码

方法一
int index = 0;
for(int i = 0;i< nums.length;i++){
if(nums[i] != 0){
nums[index] = nums[i];
index++;
}
}
for(int i = index;i< nums.length;i++){
nums[i] = 0;
}
方法二
class Solution {
public void moveZeroes(int[] nums) {
int i = 0; //下一个非0数存放的位置
int j = 0; //当前检索的位置
while (j < nums.length) {
if (nums[j] != 0) {
nums[i] = nums[j];
i++;
}
j++;
}
while (i < nums.length) {
nums[i] = 0;
i++;
}
}
}

11.盛最多水的容器

题目

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
在这里插入图片描述题意:给定数组height,任选两个下标i和j,求(j-i)*min(height[i],height[j])的最大值
思路:双指针,左指针向右检索,右指针向左检索,每次只移动高度较小的那个指针,遍历过程中记录最大面积

代码

class Solution {
public int maxArea(int[] height) {
int i=0;
int j=height.length-1;
int ans = 0;
while(i<j){
ans = Math.max(ans,(j-i)*Math.min(height[i],height[j]));
if(height[i]<=height[j]){
++i;
}
else{
–j;
}
}
return ans;
}
}

15.三数之和

题目

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
在这里插入图片描述题意:给定数组,找出任意三个数,使其和为0,三元组不能重复
思路:先排序,再使用三指针,指针i从前往后遍历,每次循环中使用双指针j和k,若当前之和小于target则右指针前移,否则左指针后移。这里的关键是需要去重。每次结果匹配后需要移动双指针时,先记录当前指针的值,然后一直移动直到数值不相等为止。

代码

class Solution {
public List<List> threeSum(int[] nums) {
List<List> res = new ArrayList<>();
Arrays.sort(nums);
for(int i=0;i<nums.length;i++){
if(nums[i]>0){
return res;
}
if(i>0&&nums[i]==nums[i-1]) continue;
int left =i+1;
int right = nums.length-1;
while(right>left){
int sum = nums[i]+nums[left]+nums[right];
if(sum>0){
right–;
}
else if(sum<0){
left++;
}
else{
res.add(Arrays.asList(nums[i],nums[left],nums[right]));
while(right>left&&nums[right]==nums[right-1]) right–;
while(right>left&&nums[left]==nums[left+1]) left++;

                right--;
                left++;

                }
           
        }
    }
    return res;
}

}

42.接雨水

题目

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
在这里插入图片描述题意:接雨水,有点抽象
思路:先统计每一个柱子的左边和右边最高柱子的高度,用这两个高度中较低的那个减去当前柱子高度就是当前这个点能够存储的水

代码

class Solution {
public int trap(int[] height) {
int n = height.length;

    if (n == 0) return 0; // 如果数组为空,直接返回0
    
    int[] leftMax = new int[n];
    int[] rightMax = new int[n];
    
    // 计算每个位置左边的最大高度
    leftMax[0] = height[0];
    for (int i = 1; i < n; i++) {
        leftMax[i] = Math.max(leftMax[i - 1], height[i]);
    }
    
    // 计算每个位置右边的最大高度
    rightMax[n - 1] = height[n - 1];
    for (int i = n - 2; i >= 0; i--) {
        rightMax[i] = Math.max(rightMax[i + 1], height[i]);
    }
    
    // 计算总的积水量
    int sum = 0;
    for (int i = 0; i < n; i++) {
        int waterLevel = Math.min(leftMax[i], rightMax[i]);
        if (waterLevel > height[i]) {
            sum += waterLevel - height[i];
        }
    }
    
    return sum;
}

}

滑动窗口

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

题目

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度。
在这里插入图片描述题意:找出不含重复字符的连续字串的长度
思路:双指针指向不含重复字符的连续字串的头和尾,用集合存储子串中的元素,有重复时,左指针持续右移,无重复后统计长度

代码

 // 使用 HashSet 存储当前窗口内的字符
    Set<Character> set = new HashSet<>();
    
    // 初始化左右指针和最大长度
    int left = 0, right = 0;
    int maxLength = 0;
    
    // 遍历字符串
    while (right < s.length()) {
        char currentChar = s.charAt(right);
        
        // 如果当前字符不在集合中,将其加入集合并扩展窗口
        if (!set.contains(currentChar)) {
            set.add(currentChar);
            right++;
            maxLength = Math.max(maxLength, right - left); // 更新最大长度
        } else {
            // 如果当前字符已经在集合中,收缩窗口
            set.remove(s.charAt(left));
            left++;
        }
    }
    
    return maxLength;

438.找到字符串中所有字母异位词

题目

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
在这里插入图片描述
题意:找出所有异位词
思路:维护一个固定长度的窗口,向后遍历,每前进一步就检查当前窗口是否满足条件,满足条件就记录下来

代码

  List<Integer> result = new ArrayList<>();
    
    // 如果 s 的长度小于 p 的长度,直接返回空列表
    if (s.length() < p.length()) {
        return result;
    }
    
    // 初始化字符频率数组
    int[] pCount = new int[26]; // 记录 p 中字符的频率
    int[] sCount = new int[26]; // 记录当前窗口中字符的频率
    
    // 填充 pCount 数组
    for (char c : p.toCharArray()) {
        pCount[c - 'a']++;
    }
    
    int left = 0, right = 0;
    int pLength = p.length();
    
    while (right < s.length()) {
        // 将当前字符加入窗口,并更新频率
        char currentChar = s.charAt(right);
        sCount[currentChar - 'a']++;
        
        // 如果窗口大小等于 p 的长度
        if (right - left + 1 == pLength) {
            // 比较两个频率数组是否相等
            if (matches(sCount, pCount)) {
                result.add(left); // 记录起始索引
            }
            
            // 收缩窗口,移除最左边的字符
            sCount[s.charAt(left) - 'a']--;
            left++;
        }
        
        // 扩展窗口
        right++;
    }
    
    return result;
}

// 辅助函数:比较两个频率数组是否相等
private boolean matches(int[] sCount, int[] pCount) {
    for (int i = 0; i < 26; i++) {
        if (sCount[i] != pCount[i]) {
            return false;
        }
    }
    return true;

子串

560.和为K的子数组

题目

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。
子数组是数组中元素的连续非空序列。
在这里插入图片描述
题意:寻找连续子数组使其元素和为k,输出数组的个数
思路:遍历数组时计算前缀和,将前缀和出现的次数存放在哈希表中。对于遍历到下标i时,只需要知道在之前的前缀和值为prefixSum[i] - target出现的次数即可,然后把次数相加。

代码

class Solution {
public int subarraySum(int[] nums, int k) {
// 创建一个哈希表来存储前缀和及其出现的次数
Map<Integer, Integer> map = new HashMap<>();

    // 初始化前缀和为0的出现次数为1
    map.put(0, 1);
    
    int sum = 0; // 当前前缀和
    int count = 0; // 记录符合条件的子数组数量
    
    // 遍历数组中的每个元素
    for (int num : nums) {
        // 更新当前前缀和
        sum += num;
        
        // 检查是否存在前缀和 sum - k
        count += map.getOrDefault(sum - k, 0);
        
        // 更新当前前缀和的出现次数
        map.put(sum, map.getOrDefault(sum, 0) + 1);
    }
    
    return count;
}

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【前端】几种常见的跨域解决方案代理的概念

几种常见的跨域解决方案&代理的概念 一、常见的跨域解决方案1. 服务端配置CORS&#xff08;Cross-Origin Resource Sharing&#xff09;&#xff1a;2. Nginx代理3. Vue CLI配置代理&#xff1a;4 .uni-app在manifest.json中配置代理来解决&#xff1a;5. 使用WebSocket通讯…

以下是基于巨控GRM241Q-4I4D4QHE模块的液位远程控制系统技术方案:

以下是基于巨控GRM241Q-4I4D4QHE模块的液位远程控制系统技术方案&#xff1a; 一、系统概述 本系统采用双巨控GRM241Q模块构建4G无线物联网络&#xff0c;实现山上液位数据实时传输至山下水泵站&#xff0c;通过预设逻辑自动控制水泵启停&#xff0c;同时支持APP远程监控及人工…

百度高德地图坐标转换

百度地图和高德地图的侧重点不太一样。同样一个地名&#xff0c;在百度地图网站上搜索到的地点可能是商业网点&#xff0c;在高德地图网站上搜索到的地点可能是自然行政地点。 高德地图api 在高德地图中&#xff0c;搜索地名&#xff0c;如“乱石头川”&#xff0c;该地名会出…

Photoshop自定义键盘快捷键

编辑 - 键盘快捷键 CtrlShiftAltK 把画笔工具改成Q , 橡皮擦改成W , 涂抹工具改成E , 增加和减小画笔大小A和S 偏好设置 - 透明度和色域 设置一样颜色 套索工具 可以自定义套选一片区域 Shiftf5 填充 CtrlU 可以改颜色/色相/饱和度 CtrlE 合并图层 CtrlShiftS 另存…

carbon 加入 GitCode:Golang 时间处理的 “瑞士军刀”

在 Golang 的开发生态中&#xff0c;时间处理领域长期存在着诸多挑战。高效、精准的时间处理对于各类软件应用的稳定运行与功能拓展至关重要。近日&#xff0c;carbon 正式加入 GitCode&#xff0c;为 Golang 开发者带来一款强大且便捷的时间处理利器&#xff0c;助力项目开发迈…

项目总结: 应用程序的扩展bundle化,自定义classLoader

目录 描述事情实现的简单说明主应用业务1业务2 实现细节描述更多总结 描述事情 应用程序的主逻辑要做一件事&#xff0c;也提供了扩展。即如果想干预这个逻辑&#xff0c;业务可以自己扩展。 设计图如下&#xff1a; 应用&#xff1a;application, AppClassLoader加载&#…

基于javaweb的SpringBoot电影推荐系统

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 运行环境开发工具适用功能说明项目介绍环境需要技术栈使用说明 运行环境 Java≥8、MySQL≥5.7 开发工具 eclipse/idea/myeclips…

linux部署ollama+deepseek+dify

Ollama 下载源码 curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linux-amd64.tgz sudo tar -C /usr -xzf ollama-linux-amd64.tgz启动 export OLLAMA_HOST0.0.0.0:11434 ollama serve访问ip:11434看到即成功 Ollama is running 手动安装deepseek…

1 推荐系统概述

推荐系统概述 1 推荐系统的意义平台方信息生产者&#xff08;物品&#xff09;信息消费者&#xff08;用户&#xff09;推荐和搜索的区别 2 推荐系统架构系统架构算法架构 3 推荐系统技术栈算法画像层召回/粗排精排重排序 工程 1 推荐系统的意义 信息生产者&#xff08;平台方…

torch_bmm验算及代码测试

文章目录 1. torch_bmm2. pytorch源码 1. torch_bmm torch.bmm的作用是基于batch_size的矩阵乘法,torch.bmm的作用是对应batch位置的矩阵相乘&#xff0c;比如&#xff0c; mat1的第1个位置和mat2的第1个位置进行矩阵相乘得到mat3的第1个位置mat1的第2个位置和mat2的第2个位置…

汽车与AI深度融合:CES Asia 2025前瞻

在科技飞速发展的当下&#xff0c;汽车与AI的融合正成为行业变革的关键驱动力。近日&#xff0c;吉利、极氪、岚图、智己等多家车企纷纷官宣与DeepSeek模型深度融合&#xff0c;其中岚图知音更是将成为首个搭载该模型的量产车型&#xff0c;这无疑是汽车智能化进程中的重要里程…

Racecar Gym 总结

1.Racecar Gym 简介 Racecar Gym 是一个基于 PyBullet 物理引擎 的自动驾驶仿真平台&#xff0c;提供 Gymnasium&#xff08;OpenAI Gym&#xff09; 接口&#xff0c;主要用于强化学习&#xff08;Reinforcement Learning, RL&#xff09;、多智能体竞速&#xff08;Multi-Ag…

jupyterLab插件开发

jupyter lab安装、配置&#xff1a; jupyter lab安装、配置教程_容器里装jupyterlab-CSDN博客 『Linux笔记』服务器搭建神器JupyterLab_linux_布衣小张-腾讯云开发者社区 Jupyter Lab | 安装、配置、插件推荐、多用户使用教程-腾讯云开发者社区-腾讯云 jupyterLab插件开发教…

1.Excel:某停车场计划调整收费标准❗(13)

目录 函数VLOOKUP ROUNDUP/ROUNDDOWN函数 NO1​ NO2会计专用类型​ NO3收费标准VLOOKUP​ NO4停放时间&#xff08;天&#xff09;​ NO5金额roundup/rounddown​ ​NO6汇总行​ NO7单元格突出显示​ NO8数据透视表​ 函数VLOOKUP VLOOKUP(收费标准!A3:B5 F4&#xf…

elasticsearch安装插件analysis-ik分词器(深度研究docker内elasticsearch安装插件的位置)

最近在学习使用elasticsearch&#xff0c;但是在安装插件ik的时候遇到许多问题。 所以在这里开始对elasticsearch做一个深度的研究。 首先提供如下链接&#xff1a; https://github.com/infinilabs/analysis-ik/releases 我们下载elasticsearch-7-17-2的Linux x86_64版本 …

Git 分布式版本控制工具使用教程

1.关于Git 1.1 什么是Git Git是一款免费、开源的分布式版本控制工具&#xff0c;由Linux创始人Linus Torvalds于2005年开发。它被设计用来处理从很小到非常大的项目&#xff0c;速度和效率都非常高。Git允许多个开发者几乎同时处理同一个项目而不会互相干扰&#xff0c;并且在…

VMware 虚拟机 ubuntu 20.04 扩容工作硬盘

一、关闭虚拟机 关闭虚拟机参考下图&#xff0c;在vmware 调整磁盘容量 二、借助工具fdisk testubuntu ~ $ df -h Filesystem Size Used Avail Use% Mounted on udev 1.9G 0 1.9G 0% /dev tmpfs 388M 3.1M 385M 1% /run /dev/sda5 …

使用python tk 做UI,实现的步骤如下:

Update UI 先~ 使用python tk 做UI,实现的步骤如下:1、点击初始化按钮后,Robot 回到Home 位置,位置到达后发送Home 给视觉,UI更新Robot位置为 Home 2、点击基准按钮后,Robot 走到POS1,位置到达后发送POS1+++当前位置(Ref_POS1_X、Ref _POS1_Y、Ref _POS1_R)给视觉,UI更…

头条百度批量采集软件说明文档

旧版说明文档《头条号文章批量采集软件4.0版本说明文档&#xff01;头条/微头条文章批量采集》 头条的采集软件已经更新了好多个版本了&#xff0c;一直没有做详细的介绍文档&#xff0c;最近更新了一些功能进去&#xff0c;一块来写一下说明文档。 1、主界面 2、头条作者采集…

Wpf美化按钮,输入框,下拉框,dataGrid

Wpf美化按钮&#xff0c;输入框&#xff0c;下拉框&#xff0c;dataGrid 引用代码后 引用资源 <ControlTemplate x:Key"CustomProgressBarTemplate" TargetType"ProgressBar"><Grid><Border x:Name"PART_Track" CornerRadius&q…