当前位置: 首页 > news >正文

秋招突击——7/5——复习{}——新作{跳跃游戏II、划分字母区间、数组中的第K个大的元素(模板题,重要)、前K个高频元素}

文章目录

    • 引言
    • 正文
      • 贪心——45 跳跃游戏II
        • 个人实现
        • 参考实现
      • 划分字母区间
        • 个人实现
        • 参考实现
      • 数组中的第K个最大元素
        • 个人实现
        • 参考做法
      • 前K个高频元素
        • 个人实现
        • 参考实现
    • 总结

引言

  • 今天就开始的蛮早的,现在是九点多,刚好开始做算法,今天有希望能够将项目的内容整理一下,然后再修改丰富一下我的简历,这个已经拖了很久了,加把劲,累点就累点吧。

正文

贪心——45 跳跃游戏II

题目链接
在这里插入图片描述
注意

  • 所有测试用例都是可到达,所有不用考虑不能到达最终目标的情况
  • 边界存在的条件为1的情况,需要考虑一下
  • 返回的是最小跳数
  • f[i] = f[i -1] + 1,如果f[i-1]到达时已经是最小跳数,那么f[i]的最小跳数就是上一个状态的最小跳数+1
个人实现
  • 想着使用动态规划实现,因为上一个状态最小的情况下,到当前状态的最小就是默认加1,想想看怎么做的。
  • f[i]表示从0到i的最小跳数,当前是在节点i,那么就遍历在当前nums[i]范围内的所有的跳数,更新一下对应的数组就行了。
class Solution {
public:int jump(vector<int>& nums) {vector<int> f(nums.size() + 1,INT_MAX);f[0] = 0;for(int i = 0;i < nums.size();i ++){for(int j = 1;j <= nums[i];j ++){if(i + j < nums.size()) f[i + j] = min(f[i + j],f[i] + 1);}}return f[nums.size() - 1];}
};
  • 意料之外,居然没有超时,我靠,太意料之外了。这个计算量得是10的7次方最大,居然没有超时,没超时就没超时把!

在这里插入图片描述

参考实现

在这里插入图片描述
在这里插入图片描述

  • 这里是维护跳数的区间数组,在某一个区间内的最小跳数始终是固定的,而且随着往后遍历,区间的跳数是递增的,根据上述推论实现代码如下
class Solution {
public:int jump(vector<int>& nums) {vector<int> f(nums.size() + 1,0);for(int i = 1,j = 0;i < nums.size();i ++){while(j + nums[j] < i)  j ++;       // 不断将j向后移动,保证当前跳数范围包括了对应if[i] = f[j] + 1;// 更新每一个节点所属的最少跳数段落信息,维护对应的数组}return f[nums.size() - 1];}
};

确实很巧妙,学到了,这个跳数这里应该不会再出问题了

这个可以看看之前的做的跳跃游戏原始版本,题目链接

  • 那道题也是使用类似方法,主要是通过最远距离和i之间的关系,判定能否到达最远距离,中间会不会出现断链的情况。

划分字母区间

  • 题目链接
    在这里插入图片描述
    在这里插入图片描述

注意

  • 同一个字母最多出现在一个片段中,每一个字母只能用一次
  • 片段数最多的情况
  • 所有划分结果顺序拼接,最终仍然是s
  • 小写英文字母组成
  • 长度最小是1
    保证每一个片段的字母是彼此不同的,而且要保证最终的片段数尽可能多
个人实现
  • 这里有一个约束,就是每一个字母只能在一个片段出现,不能横跨两个片段,这个怎么实现?
  • 这个题也是类似横跨区间的问题,保证一个字母出现的第一个索引和最后一个索引都是在同一个片段内部,不然就不满足约束条件,所以需要记录所有的字母的出现的两个位置。
  • 然后就是怎么合理的安排区间的问题。是否需要进行二次遍历,保证区间的相互包含,从而实现最多的划分。
  • 这里的时间复杂度目测是O(n),我需要遍历两次
class Solution {
public:vector<int> partitionLabels(string s) {vector<int> res;// 更新记录每一个元素出现的最早的位置和vector<pair<int,int>> word(27,{s.size() - 1,0});for(int i = 0;i < s.size();i ++){word[s[i] - 'a'].first = min(i,word[s[i] - 'a'].first);word[s[i] - 'a'].second = max(i, word[s[i] - 'a'].second);}cout<<word[s[0] - 'a'].first<<endl;cout<<word[s[0] - 'a'].second<<endl;// 再次遍历计算区间的长度int beg = word[s[0] - 'a'].first , end = word[s[0] - 'a'].second;for(int i = 0;i < s.size();i ++){end = max(word[s[i] - 'a'].second,end);if(i == end){// 遍历到尾节点,直接添加结果res.push_back(end - beg + 1);beg = i + 1;if(i + 1 < s.size())    end = word[s[i + 1] - 'a'].second;}}return res;}
};

在这里插入图片描述

  • 这个方法中规中矩,没有任何异常,代码量也挺多的。不过做出来了。
参考实现

序列是无序的

  • 从前往后和从后往前效果是一样的
  • 是否需要进行排序,保证他是有序的,降低问题的难度

正式思路

  • 思路和我的差不多,只不过 他是仅仅记录了每一个字母出现的最终位置,而且使用的是hashmap,这里就得讨论一下,使用数组和hashmap哪个更快。理论上来时数组更快,但是写起来比较难看。

  • 具体实现代码如下,基本上都是一致的

class Solution {
public:vector<int> partitionLabels(string s) {vector<int> res;// 更新记录每一个元素出现的最早的位置和vector<int> word(27,0);for(int i = 0;i < s.size();i ++){word[s[i] - 'a'] = max(i, word[s[i] - 'a']);}cout<<word[s[0] - 'a']<<endl;// 再次遍历计算区间的长度int beg = 0 , end = word[s[0] - 'a'];for(int i = 0;i < s.size();i ++){end = max(word[s[i] - 'a'],end);if(i == end){// 遍历到尾节点,直接添加结果res.push_back(end - beg + 1);beg = i + 1;if(i + 1 < s.size())    end = word[s[i + 1] - 'a'];}}return res;}
};

数组中的第K个最大元素

题目链接
在这里插入图片描述
注意

  • 规定了时间复杂度,O(n)只能遍历一次
  • 第K大的元素,是排序只有第K大的元素
  • 数组长度[1, 1 0 5 10^5 105]
  • 每一个元素范围是正负 1 0 4 10^{4} 104
  • 元素与元素之家存在重复的情况
个人实现
  • 这里是制定了,只能通过遍历来实现,想想看怎么做。
  • 转换一下问题思路,如果是找最大的元素,就是完整的遍历并且比较一遍,然后找最小的元素也使完整的遍历一遍,然后在比较一遍,确定一个最大值。
  • 如果是确定第二大的数字,就是如果一个数字比最大的大的话,就默认往后进行顺。
  • 所以这里想办法维护一个队列,每次都是从和队首元素进行比较,然后固定长度是K,如果超过了固定长度直接弹出最后一个元素。
  • 这样不一定是目标值。

对于队列的使用有点问题了,然后返回的是队首的元素。

class Solution {
public:int findKthLargest(vector<int>& nums, int k) {queue<int> q;for(auto x :nums){//队列是空的,直接添加if(q.empty())   q.push(x);// 如果大于队首元素,直接入队if(q.back() < x )   q.push(x);while(q.size() > k)    q.pop();}return q.front();}
};
  • 这里只能通过一半的样例,如果一开始就给我最大值,通不过测试样例,所以不行!
  • 这个方法根本就不行!
    在这里插入图片描述
  • 不会做!
  • 使用堆排序,肯定不对呀,是logN的操作复杂度
参考做法
  • 这里是一道模板题,是建立在快排的基础上实现的,所以需要背一下快排的模板,具体如下
    在这里插入图片描述
void quick_sort(int q[],int l,int r){if(l >= r)	return ;// 确定中间值、左边界、右边界// 中间元素不参加排序,i是从x的左侧一个开始,j是从x的右侧开始int i = l - 1,j = r + 1,x = q[l + r >> 1];while(i < j){do i ++; while(q[i] < x);do j -- ;while(q[j] > x);if(i < j)	swap(q[i],q[j]);}quick_sort(q,l,j),quick_sort(q,j + 1,r);
}
  • 这里的j就是最终的区分索引,所以k应该也是和j进行比较,然后再进行判定的是左边进行快排,还是右边进行快排。
  • 这是一道经典的模板题,需要好好背一下。
  • 根据模板题,好好做一下
class Solution {
public:int quickSort(vector<int> &nums,int l,int r,int k){if(l == r)  return  nums[k];int i = l - 1,j = r + 1 ,x = nums[(l + r) >> 1];while(i < j){do i ++ ;while(nums[i] > x);do j -- ; while(nums[j] < x);if(i < j) swap(nums[i],nums[j]);}   if(k <= j)   return quickSort(nums,l,j,k);else  return quickSort(nums,j + 1,r,k);}int findKthLargest(vector<int>& nums, int k) {return quickSort(nums,0,nums.size() - 1,k-1);}
};
  • 这是一个模板题,只能说是超过了我的知识范围,所以还是得不断补充完善。

前K个高频元素

题目链接

在这里插入图片描述
注意

  • 出现频率前K高的元素
  • 按照任意顺序返回
  • 数据保证答案唯一
个人实现
  • 这道题没有说数据是有序的,并不能从顺序进行考虑。
  • 最直白的做法, 统计每一个元素出现的次数,然后使用出现的次数进行排序,然后返回前k高地元素,也就是返回阈值之前的所有的元素。
class Solution {
public:vector<int> topKFrequent(vector<int>& nums, int k) {unordered_map<int,int>  counts;for(auto x : nums)  counts[x] ++;vector<pair<int,int>>   ct;for(auto item : counts) ct.push_back({item.first,item.second});sort(ct.begin(),ct.end(),[](auto a,auto b){return a.second > b.second;});vector<int> res;for(int i = 0;i < k;i ++)   res.push_back(ct[i].first);return res;}
};
  • 纯硬做,直接模拟思路,完全照搬!
    在这里插入图片描述
参考实现
  • 前半部分思路是一样的,就是要统计每一个元素的出现的次数,然后形成一个key-value键值对,然后使用计数排序,实现前k个频率最高的元素的计算。
  • 具体代码如下
class Solution {
public:vector<int> topKFrequent(vector<int>& nums, int k) {unordered_map<int,int>  counts;for(auto x : nums)  counts[x] ++;int m = nums.size();vector<int>   ct(m + 1,0);// 实现计数排序for(auto [k,v]:counts)  ct[v] ++;// 遍历前k个元素,计算一个边界次数int edg = m,s = 0;while(s < k)   s+= ct[edg --];// 遍历获取的满足条件的kvector<int> res;for(auto [k,v]:counts)  {if(v > edg)   res.push_back(k);}return res;}
};

遍历map的好方法

  • 使用[a,b]然后加上auto实现
for(auto [k,v] : map)

总结

  • 大概测了一下,发现自己做一道题,加上修改的总结的时间是超过了50分钟的,有点吓人,一天得花多少时间是用来做算法题。还是得快一点。
  • 可以,今天的效率蛮快的,在十一点就完成了算法题的内容,下面再补充一下关于设计模式的相关知识,然后下午就看一下我们的项目了。加油,冲 !
  • 剑走偏锋呀,感觉自己的路子不对,很多东西都没有专门走过,所以就会有很多问题,现在得转换一下思路,项目的代码我看的不是很懂,那就要从不是很懂的地方一点点开始看,一点点开始弄。现在欠缺了太多东西,后续还要增加每天一样的知识补充。其实很多东西,都是要花时间去弄的,现在就是知道MySQL的基础的东西,但是对于高可用的东西,并不了解。然后Java的多线程编程也不知道,感觉还是得花大时间。
  • 现在应该专心去弄什么?有点乱,感觉有点自暴自弃,觉得完蛋了,但是其实那几个项目并不难,跟着往后做就行了。加油吧。如果有不懂的,就去找SSM中学过的,然后就是哪里不行,补充哪里。
  • 我得调整一下自己的计划,现在欠缺的是项目还有简历,得想办法结合项目,把简历整理出来,后续再根据简历上的东西进行一点点补充。
  • 看项目有点吃力,是因为我从来没有跟着一个东西,从头到尾敲过一个项目,所以看的很吃力。
  • 晚上有点摆烂了,学了一天了,太累了,晚上注意力难以集中!!
  • 明天加油吧!

相关文章:

秋招突击——7/5——复习{}——新作{跳跃游戏II、划分字母区间、数组中的第K个大的元素(模板题,重要)、前K个高频元素}

文章目录 引言正文贪心——45 跳跃游戏II个人实现参考实现 划分字母区间个人实现参考实现 数组中的第K个最大元素个人实现参考做法 前K个高频元素个人实现参考实现 总结 引言 今天就开始的蛮早的&#xff0c;现在是九点多&#xff0c;刚好开始做算法&#xff0c;今天有希望能够…...

【Linux】信号的处理

你很自由 充满了无限可能 这是很棒的事 我衷心祈祷你可以相信自己 无悔地燃烧自己的人生 -- 东野圭吾 《解忧杂货店》 信号的处理 1 信号的处理2 内核态 VS 用户态3 键盘输入数据的过程4 如何理解OS如何正常的运行5 如何进行信号捕捉信号处理的总结6 可重入函数volatile关…...

Python数据分析的数据导入和导出

在Python数据分析中&#xff0c;数据的导入和导出是非常关键的步骤。这些步骤通常涉及到将数据从外部文件&#xff08;如CSV、Excel、数据库等&#xff09;读入到Python程序中&#xff0c;以及将处理后的数据导出回外部文件或数据库。以下是一些常用的库和方法来实现这些操作。…...

【JAVA多线程】线程池概论

目录 1.概述 2.ThreadPoolExector 2.1.参数 2.2.新任务提交流程 2.3.拒绝策略 2.4.代码示例 1.概述 线程池的核心&#xff1a; 线程池的实现原理是个标准的生产消费者模型&#xff0c;调用方不停向线程池中写数据&#xff0c;线程池中的线程组不停从队列中取任务。 实现…...

java双亲委派机制

Java中的双亲委派机制&#xff08;Parent Delegation Model&#xff09;是一种类加载机制&#xff0c;它确保了类加载的安全性和一致性。该机制规定了类加载器在加载类时的顺序和方式&#xff0c;从而避免了重复加载和类冲突问题。 以下是一个简单的自定义类加载器的示例&#…...

记录第一次使用air热更新golang项目

下载 go install github.com/cosmtrek/airlatest 下载时提示&#xff1a; module declares its path as: github.com/air-verse/air but was required as: github.com/cosmtrek/air 此时&#xff0c;需要在go.mod中加上这么一句&#xff1a; replace github.com/cosmtrek/air &…...

Leetcode 3213. Construct String with Minimum Cost

Leetcode 3213. Construct String with Minimum Cost 1. 解题思路2. 代码实现 题目链接&#xff1a;3213. Construct String with Minimum Cost 1. 解题思路 这一题的话思路上还是比较直接的&#xff0c;就是一个trie树加一个动态规划&#xff0c;通过trie树来快速寻找每一个…...

python操作SQLite3数据库进行增删改查

python操作SQLite3数据库进行增删改查 1、创建SQLite3数据库 可以通过Navicat图形化软件来创建: 2、创建表 利用Navicat图形化软件来创建: 存储在 SQLite 数据库中的每个值(或是由数据库引擎所操作的值)都有一个以下的存储类型: NULL. 值是空值。 INTEGER. 值是有符…...

【电控笔记6.7】非最小相位系统

全通滤波器 [...

Day05-04-持续集成总结

Day05-04-持续集成总结 1. 持续集成2. 代码上线目标项目 1. 持续集成 git 基本使用, 拉取代码,上传代码,分支操作,tag标签 gitlab 用户 用户组 项目 , 备份,https,优化. jenkins 工具平台,运维核心, 自由风格工程,maven风格项目,流水线项目, 流水线(pipeline) mavenpom.xmlta…...

PyQt5动态热力图清空画布关闭ColorBar

PyQt5生成正弦波动态热力图清空画布关闭ColorBar 1、简介 生成随机正弦波,使用pyqtgraph展示出来,并且使用热力图展示不同频率的正弦波,使用不同的画布颜色显示热力图的变化。 使用python3.8 导入库: pip install matplotlib==3.7.5 pip install numpy==1.24.4 pip in…...

python爬虫入门(一)之HTTP请求和响应

一、爬虫的三个步骤&#xff08;要学习的内容&#xff09; 1、获取网页内容 &#xff08;HTTP请求、Requests库&#xff09; 2、解析网页内容 &#xff08;HTML网页结构、Beautiful Soup库&#xff09; 3、存储或分析数据 b站学习链接&#xff1a; 【【Python爬虫】爆肝两…...

华为OD机考题(HJ41 称砝码)

前言 经过前期的数据结构和算法学习&#xff0c;开始以OD机考题作为练习题&#xff0c;继续加强下熟练程度。有需要的可以同步练习下。 描述 现有n种砝码&#xff0c;重量互不相等&#xff0c;分别为 m1,m2,m3…mn &#xff1b; 每种砝码对应的数量为 x1,x2,x3...xn 。现在要…...

Qt涂鸦板

Qt版本&#xff1a;Qt6 具体代码&#xff1a; 头文件 dialog.h #ifndef DIALOG_H #define DIALOG_H#include <QDialog>QT_BEGIN_NAMESPACE namespace Ui { class Dialog; } QT_END_NAMESPACEclass Dialog : public QDialog {Q_OBJECTpublic:Dialog(QWidget *parent n…...

C++_03

1、构造函数 1.1 什么是构造函数 类的构造函数是类的一种特殊的成员函数&#xff0c;它会在每次创建类的新对象时执行。 每次构造的是构造成员变量的初始化值&#xff0c;内存空间等。 构造函数的名称与类的名称是完全相同的&#xff0c;并且不会返回任何类型&#xff0c;也不…...

强化学习中的Double DQN、Dueling DQN和PER DQN算法详解及实战

1. 深度Q网络&#xff08;DQN&#xff09;回顾 DQN通过神经网络近似状态-动作值函数&#xff08;Q函数&#xff09;&#xff0c;在训练过程中使用经验回放&#xff08;Experience Replay&#xff09;和固定目标网络&#xff08;Fixed Target Network&#xff09;来稳定训练过程…...

前端八股文 说一说样式优先级的规则是什么?

标准的回答 CSS样式的优先级应该分成四大类 第一类 !important&#xff1a; &#x1f604;无论引入方式是什么&#xff0c;选择器是什么&#xff0c;它的优先级都是最高的。 第二类 引入方式&#xff1a; &#x1f604;行内样式的优先级要高于嵌入和外链&#xff0c;嵌入和外链…...

洞察国内 AI 绘画行业的璀璨前景

在科技的浪潮中&#xff0c;AI 绘画如同一颗璀璨的新星&#xff0c;正在国内的艺术与技术领域绽放出耀眼的光芒。 近年来&#xff0c;国内 AI 绘画行业发展迅猛&#xff0c;展现出巨大的潜力。随着人工智能技术的不断突破&#xff0c;AI 绘画算法日益精进&#xff0c;能够生成…...

socket编程

文章目录 套接字网路字节序列TCP和UDP套接字 本文章主要介绍Linux下套接字的相关接口&#xff0c;和一些基础知识。 套接字 所有网络通信的行为本质都是进程间进行通信&#xff0c;网络通信也是进程间通信&#xff0c;只不过是不同主机上的两个进程之间的通信。网络通信对于双…...

python自动移除excel文件密码(升级v2版本)

欢迎查看第一版 https://blog.csdn.net/weixin_45631815/article/details/140013476?spm1001.2014.3001.5502 一功能改进 此版本主要改进功能有以下: 直接可以调用函数实现可以尝试多个密码没有加密的文件进行保存,可以按实际业务进行改进.思路来源:java 面向对象设计模式.…...

深入MOJO编程语言的单元测试世界

引言 在软件开发的历程中&#xff0c;单元测试扮演着至关重要的角色。单元测试不仅帮助开发者确保代码的每个部分都按预期工作&#xff0c;而且也是代码质量和维护性的关键保障。本文将引导读者了解如何在MOJO这一假想编程语言中编写单元测试&#xff0c;尽管MOJO并非真实存在…...

Canvas:掌握颜色线条与图像文字设置

想象一下&#xff0c;用几行代码就能创造出如此逼真的图像和动画&#xff0c;仿佛将艺术与科技完美融合&#xff0c;前端开发的Canvas技术正是这个数字化时代中最具魔力的一环&#xff0c;它不仅仅是网页的一部分&#xff0c;更是一个无限创意的画布&#xff0c;一个让你的想象…...

打包导入pyzbar的脚本时的注意事项

目录 前言问题问题的出现解决 总结 本文由Jzwalliser原创&#xff0c;发布在CSDN平台上&#xff0c;遵循CC 4.0 BY-SA协议。 因此&#xff0c;若需转载/引用本文&#xff0c;请注明作者并附原文链接&#xff0c;且禁止删除/修改本段文字。 违者必究&#xff0c;谢谢配合。 个人…...

02-android studio实现下拉列表+单选框+年月日功能

一、下拉列表功能 1.效果图 2.实现过程 1&#xff09;添加组件 <LinearLayoutandroid:layout_width"match_parent"android:layout_height"wrap_content"android:layout_marginLeft"20dp"android:layout_marginRight"20dp"android…...

曹操的五色棋布阵 - 工厂方法模式

定场诗 “兵无常势&#xff0c;水无常形&#xff0c;能因敌变化而取胜者&#xff0c;谓之神。” 在三国的战场上&#xff0c;兵法如棋&#xff0c;布阵如画。曹操的五色棋布阵&#xff0c;不正是今日软件设计中工厂方法模式的绝妙写照吗&#xff1f;让我们从这个神奇的布阵之…...

谷粒商城学习笔记-逆向工程错误记录

文章目录 1&#xff0c;Since Maven 3.8.1 http repositories are blocked.1.1 在maven的settings.xml文件中&#xff0c;新增如下配置&#xff1a;1.2&#xff0c;执行clean命令刷新maven配置 2&#xff0c;internal java compiler error3&#xff0c;启动逆向工程报错&#x…...

FastAPI+SQLAlchemy数据库连接

FastAPISQLAlchemy数据库连接 目录 FastAPISQLAlchemy数据库连接配置数据库连接创建表模型创建alembic迁移文件安装初始化编辑env.py编辑alembic.ini迁移数据库 视图函数查询 配置数据库连接 # db.py from sqlalchemy import create_engine from sqlalchemy.orm import sessio…...

Android中的适配器,你知道是做什么的吗?

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD&#xff0c;日常还会涉及Android开发工作。 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起…...

GitHub详解:代码托管与协作开发平台

文章目录 一、GitHub简介二、GitHub的核心功能2.1 仓库&#xff08;Repository&#xff09;2.2 版本控制与分支&#xff08;Branch&#xff09;2.3 Pull Request2.4 Issues与Projects2.5 GitHub Actions 三、GitHub的使用方法3.1 注册与登录3.2 创建和管理仓库3.3 使用Git进行代…...

【植物大战僵尸杂交版】获取+存档插件

文章目录 一、还记得《植物大战僵尸》吗&#xff1f;二、在哪下载&#xff0c;怎么安装&#xff1f;三、杂交版如何进行存档功能概述 一、还记得《植物大战僵尸》吗&#xff1f; 最近&#xff0c;一款曾经在15年前风靡一时的经典游戏《植物大战僵尸》似乎迎来了它的"文艺复…...