leetcode 2.27

leetcode hot 100

  • 哈希
    • 1.字母异位词分组
    • 2.最长连续序列
  • 双指针
    • 1.盛最多水的容器
    • 2.和为 K 的子数组
  • 数组
    • 1.除自身以外数组的乘积

哈希

1.字母异位词分组

49. 字母异位词分组

方法一:排序
由于互为字母异位词的两个字符串包含的字母相同,因此对两个字符串分别进行排序之后得到的字符串一定是相同的,故可以将排序之后的字符串作为哈希表的键。

unordered_map<string, vector<string>>

主要是理解,key是排序后的字母序列,value是vector,存放了多个string

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        int n = strs.size();
        unordered_map<string, vector<string>> map;
        for (auto s : strs) {
            string tmp = s;
            sort(tmp.begin(), tmp.end());
            map[tmp].emplace_back(s);
        }
        vector<vector<string>> ans;
        for (unordered_map<string, vector<string>>::iterator it = map.begin(); it != map.end(); it++) {
            ans.emplace_back(it->second);
        }
        return ans;
    }
};

2.最长连续序列

128. 最长连续序列
重要的是思路,
1.用set去除重复数
2.找到一个序列起点最小的数num,开始在容器里while找num++是否存在,如果存在那么len++
3.怎么找到最小数,也不能说是最小数,是一个连续数种的最小数,num - 1如果存在那么他就不是连续的最小数
在这里插入图片描述

unordered_set<int> mp;
...
for (auto num: mp) {
	if (mp.count(num -1)) continue;
	int curnum = num;
	int len = 1;

	while (mp.count(curnum + 1)) {
		curnum += 1;
		len += 1;
	}
	longestlen = max(len, longestlen);
}
class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        int res = 0;    // 记录最长连续序列的长度
        unordered_set<int> num_set(nums.begin(), nums.end());   // 记录nums中的所有数值
        int seqLen;
        for(int num: num_set){
            // 如果当前的数是一个连续序列的起点,统计这个连续序列的长度
            if(!num_set.count(num - 1)){
                seqLen = 1;     // 连续序列的长度,初始为1
                while(num_set.count(++num))seqLen++;    // 不断查找连续序列,直到num的下一个数不存在于数组中
                res = max(res, seqLen);     // 更新最长连续序列长度
            }
        }
        return res;
    }
};

双指针

1.盛最多水的容器

11. 盛最多水的容器
两个for循环找最大值会超时,那么就有小心机,如果当前高度不比之前高,那么答案一定小于之前的值,就不必再循环了

class Solution {
public:
    int maxArea(vector<int>& height) {
        int left = 0, ans = 0, high = 0;
        for (; left < height.size() - 1; left++) {
            if (height[left] > high) high = height[left];
            if (height[left] < high) continue;
            for (int right = left + 1; right < height.size(); right++) {
                int tmp = (right - left) * min(height[left], height[right]);
                ans = max(ans, tmp); 
            }
        }
        return ans;
    }
};

正经的比较快的算法是,两端向中间移动,每次移动较小的边,计算最大值

class Solution {
public:
    int maxArea(vector<int>& height) {
        int l = 0, r = height.size() - 1;
        int ans = min(height[l], height[r]) * (r - l);
        while (l < r) {
            if (height[l] < height[r]) {
                l++;
            } else {
                r--;
            }
            ans = max(ans, (r - l) * min(height[l], height[r]));
        }
        return ans;
    }
};

2.和为 K 的子数组

560. 和为 K 的子数组
题目需要注意的是和为K的子数组,那么:
1.用pre[i]表示num[0]到num[i]的和
2.num[i + 1]到num[j]的和为 pre[j] - pre[i]
3.其和为k, 那么,nums[j]位置需要找到和为pre[j] - k的前缀和

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        unordered_map<int, int> mp;
        mp[0] = 1;
        int pre = 0, ans = 0;
        for (auto &c : nums) {
            pre += c;
            if (mp.count(pre - k)) {
                ans += mp[pre - k];
            }
            mp[pre]++;
        }
        return ans;
    }
};

数组

1.除自身以外数组的乘积

238. 除自身以外数组的乘积
还是想用前缀和做,计算num[i]的乘积,就是计算pre[i -1] * 后缀和
但是超时了

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        vector<int> ans;
        int pre = 0;
        for (int i = 0; i < nums.size(); i++) {
            if (i == 0) 
                pre = 1;
            else 
                pre *= nums[i - 1];
            int tmp = pre;
            for (int j = i + 1; j < nums.size(); j++) {
                tmp *= nums[j];
            }
            ans.emplace_back(tmp);
        }
        return ans;
    }
};

前缀和 + 后缀和
前缀和
1.i从0开始向后
2.ans[i] = pre;
3.pre *= nums[i];
先把pre[i -1]放到ans[i],再乘

后缀和
1.i从size()-1开始向前
2.ans[i] *= sum2;
3.sum2 *= nums[i];
前缀乘以back[i+1]到back.end() - 1

https://blog.csdn.net/qq_43553082/article/details/118620364
vector在还没有分配任何空间时还不能像数组一样用下标形式去访问vector的(v[0]也不行)!!!否则编译通过但报运行错误runtime error!
如vector创建的时候是使用:vector<int> v;
或者vector还是[]的时候(考虑官方测试数据的输入可能为[]的情况,使用[ ]前需要判断一下是否为空)会报错!
如:v[0]=1、if(v[0])、v[0]等情况都会报错
这种情况需要先push_back()或v={1,2}等形式给其分配了空间后,才能用【】形式访问!
本题中:
vector<int> ans(nums.size());

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        vector<int> ans(nums.size());
        int sum = 1;
        for (int i = 0; i < nums.size(); i++) {
            ans[i] = sum;
            sum *= nums[i];
        }
        int sum2 = 1;
        for (int i = nums.size() - 1; i >= 0; i--) {
            ans[i] *= sum2;
            sum2 *= nums[i];
        }
        return ans;
    }
};

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

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

相关文章

Redis之一: 简介及环境安装搭建

什么是NoSQL? NoSQL&#xff0c;指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写&#xff0c;是对不同于传统的关系型数据库的数据库管理系统的统称。 NoSQL用于超大规模数据的存储。&#xff08;例如谷歌或Facebook每天为他们的用户收集万亿比特的数据&#xf…

python:时间序列谐波拟合与残差分析(利用最小二乘法确定模型参数)

作者&#xff1a;CSDN _养乐多_ 在科学研究中&#xff0c;经常需要对实验数据进行拟合&#xff0c;以找出其中的规律。本文介绍了如何使用Python中的NumPy、Matplotlib和SciPy库进行谐波拟合&#xff0c;并对拟合结果进行残差分析。 从下图可以看出&#xff0c;谐波拟合曲线…

Python算法100例-2.6 分糖果

完整源代码项目地址&#xff0c;关注博主私信源代码后可获取 1.问题描述2.问题分析3.算法设计4.确定程序框架5.完整的程序6.运行结果 1&#xff0e;问题描述 10个小孩围成一圈分糖果&#xff0c;老师分给第1个小孩10块&#xff0c;第2个小孩2块&#xff0c;第3个小孩8块&…

C#,弗洛伊德-瑞文斯特(Floyd-Rivest)算法与源代码

Robert W. Floyd 1 Floyd-Rivest 算法 Floyd-Rivest 算法是一种选择算法&#xff0c;用于在不同元素的数组中找到第k个最小元素。它类似于快速选择算法&#xff0c;但在实际运行中有更好的运行时间。 和 QuickSelect 一样&#xff0c;该算法基于分区的思想工作。对数组进行分…

istio学习记录——VirtualService详解

上一篇使用VirtualService进行了简单的流量控制&#xff0c;并通过Gateway将流量导入到了集群内。这一篇将更加深入的介绍 VirtualService。 k8s中有service&#xff0c;service能够对流量进行负载均衡&#xff0c;那为什么istio又引入了VirtualService呢&#xff0c;因为serv…

最新IE跳转Edge浏览器解决办法(2024.2.26)

最新IE跳转Edge浏览器解决办法&#xff08;2024.2.26&#xff09; 1. IE跳转原因1.1. 原先解决办法1.2. 最新解决办法1.3. 最后 1. IE跳转原因 关于IE跳转问题是由于在2023年2月14日&#xff0c;微软正式告别IE浏览器&#xff0c;导致很多使用Windows10系统的电脑在打开IE浏览…

300分钟吃透分布式缓存-17讲:如何理解、选择并使用Redis的核心数据类型?

Redis 数据类型 首先&#xff0c;来看一下 Redis 的核心数据类型。Redis 有 8 种核心数据类型&#xff0c;分别是 &#xff1a; & string 字符串类型&#xff1b; & list 列表类型&#xff1b; & set 集合类型&#xff1b; & sorted set 有序集合类型&…

多线程与高并发(1)- 线程基础、并发特性、锁、JUC工具

文章目录 第一章、线程基础知识一、基础概念1、什么是程序&#xff1f;2、什么是进程&#xff1f;3、什么是线程&#xff1f;4、什么是线程的切换&#xff08;Context Switch&#xff09;&#xff1f;5、单核CPU 设定多线程是否有意义&#xff1f;6、工作线程数是不是设置的越大…

【Linux】部署单机项目(自动化启动)---(图文并茂详细讲解)

目录 一 准备工作 1.1 连接服务器拷贝文件 1.2 解压 二 JDK安装 2.1 配置坏境变量 2.2 查看版本 三 Tomcat(自启动) 3.1 复制启动命令的位置 3.2 添加命令相关配置文件 3.2.1 配置jdk及tomcat目录 3.2.2 添加优先级 3.3 设置自启动命令 3.4 开放端口 四 My…

行业交流 | “建筑工业化—创新型建筑技术的应用”主题沙龙

11月9日下午&#xff0c;由环同济知识经济圈发展推进领导小组办公室指导&#xff0c;上海市杨浦区科委、同济科技园核心园、同济EMBA设计协会联合主办&#xff0c;环同济发展促进会协办的“建筑工业化——创新型建筑技术的应用”主题沙龙在我园区顺利举办。优积建筑科技发展(上…

32单片机基础:TIM定时中断

STM32中功能最强大&#xff0c;结构最复杂的一个外设——定时器 因为定时器的内容很多&#xff0c;所以本大节总共分为4个部分&#xff0c;8小节。 第一部分&#xff1a;主要讲定时器基本的定时功能,也就是定一个时间&#xff0c;然后让定时器每隔这个时间产生一个中断&#…

鸿蒙ArkTs开发WebView问题总结

1. 加载WebView页面报错"Can not read properties of null (reading getltem)" 解决: 在加载webview的controller中加入.domStorageAccess(true) build() {Column() {Row().width(100%).height(50rpx)Web({ src: src, controller: this.controller }).javaScriptAc…

【2.3深度学习开发任务实例】(1)神经网络模型的特点【大厂AI课学习笔记】

从本章开始&#xff0c;我把标题的顺序变了一下&#xff0c;大厂AI课笔记&#xff0c;放到后面。因为我发现App上&#xff0c;标题无法显示完全。 从本章开始&#xff0c;要学习深度学习开发任务的全部过程了。 我们将通过小汽车识别赛道上的标志牌&#xff0c;给出检测框&am…

Leetcoder Day25| 回溯part05:子集+排列

491.递增子序列 给定一个整型数组, 你的任务是找到所有该数组的递增子序列&#xff0c;递增子序列的长度至少是2。 示例: 输入:[4, 7, 6, 7]输出: [[4, 6], [4, 7], [4, 6, 7], [6, 7], [7,7], [4,7,7]] 说明: 给定数组的长度不会超过15。数组中的整数范围是 [-100,100]。给定数…

Camtasia 2023 v23.4.2.51146 (x64) 中文激活授权版(附安装教程+激活补丁) 喀秋莎(屏幕录制剪辑) 常用快捷键

目录 功能特性 常用快捷键 一、关于文件设置 二、关于编辑设置 三、关于视图设置 四、关于录制设置 破解说明 Camtasia 2023免费版是一款由TechSmith公司官方进行汉化推出的最新版本&#xff0c;该软件集屏幕录制和视频剪辑功能于一体的软件&#xff0c;提供屏幕录制、区域录…

Maya笔记 设置工作目录

Maya会把素材场景等自动保存在工作目录里&#xff0c;我们可以自己定义工作目录 步骤1 创建workspace.mel文件 文件/设置项目 ——>选择一个文件夹&#xff0c;点击设置——>创建默认工作区 这一个后&#xff0c;可以在文件夹里看到.mel文件 步骤2 自动创建文件夹…

Groovy(第九节) Groovy 之单元测试

JUnit 利用 Java 对 Song 类进行单元测试 默认情况下 Groovy 编译的类属性是私有的,所以不能直接在 Java 中访问它们,必须像下面这样使用 setter: 编写这个测试用例余下的代码就是小菜一碟了。测试用例很好地演示了这样一点:用 Groovy 所做的一切都可以轻易地在 Java 程序…

使用 Debezium 和 RisingWave 对 MongoDB 进行持续分析

MongoDB 和流式 Join 的挑战 谷歌趋势显示&#xff0c;有关 MongoDB 流式计算的搜索率不断上升 作为一种操作型数据库&#xff0c;MongoDB 在提供快速数据操作和查询性能方面表现十分出色。然而&#xff0c;在维护实时视图或执行流处理任务的内置支持方面&#xff0c;它确实存…

uni-app之android原生插件开发

官网 uni小程序SDK 一 插件简介 1.1 当HBuilderX中提供的能力无法满足App功能需求&#xff0c;需要通过使用Andorid/iOS原生开发实现时&#xff0c;可使用App离线SDK开发原生插件来扩展原生能力。 1.2 插件类型有两种&#xff0c;Module模式和Component模式 Module模式&…

51单片机 wifi连接

一、基本概念 ESP8266是一款集成了WiFi功能的高性能芯片&#xff0c;广泛应用于物联网设备、智能家居、传感器网络等领域。以下是ESP8266的详细讲解&#xff1a; 1. 功能特点&#xff1a;ESP8266集成了TCP/IP协议栈&#xff0c;支持STA&#xff08;Station&#xff09;和AP&am…