![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法分析与设计
天天向上的菜鸡杰!!
生活明朗 万物可爱 人间值得 全力以赴
展开
-
leetcode239. 滑动窗口最大值(java详解)
一:题目二:思路1:lc通过版class Solution { /* 思路:1.这里是要求出每一个窗口中的最大值,那么我们自然的想到如何用一个队列 可以使其每次队首 出现最大值,那么我自然回想到大顶堆,但是用了之后,我们窗口中的元素位置就发生了变化 那么当我们移动窗口的时候,就不能正确的 pop出窗口的首个元素。 2.那么这里的话,我们就自定义一个队列,当然的话,让其满足每次pop出去的最原创 2022-04-30 18:02:31 · 1120 阅读 · 0 评论 -
leetcode150. 逆波兰表达式求值
一:题目二:上码class Solution {public: /** 思路:1.当我们遇见数的时候 我们就将其入栈 2.当我们遇见符号的时候就栈中前面的两个数出栈进行计算,然后再将计算结果入栈。 3.最终栈中剩余一个元素就是我们的答案 4.这里我们需要将string类型转换int int nums = stoi(str); */ int evalRPN(vector<原创 2022-04-29 18:38:20 · 1159 阅读 · 0 评论 -
leetcode1047. 删除字符串中的所有相邻重复项
一:题目二:上码class Solution {public: string removeDuplicates(string s) { stack<char>st; string str; st.push(s[0]); for (int i = 1; i < s.size(); i++) { if (!st.empty() && s[i]原创 2022-04-29 18:08:59 · 276 阅读 · 0 评论 -
leetcode20. 有效的括号
一:题目二:上码class Solution {public: /** 思路: - 这个题厉害之处在于其遍历到符号的左半部分的时候,我们是将对应的右半部分入队的 - 那么如果存在对应的元素的话,那么我们就可以判断跟栈顶元素是否相等。 */ bool isValid(string s) { stack<char> st; for (int i原创 2022-04-29 17:37:50 · 842 阅读 · 0 评论 -
leetcode225. 用队列实现栈
一:题目二:上码class MyStack {private: /** 思路:1.我们每次push的时候 先push进队列,然后的话,将该元素前面的元素都出队重新push进该队列的尾部 */ queue<int>q;public: /** Initialize your data structure here. */ MyStack() { } /** Push element x on原创 2022-04-29 17:06:32 · 139 阅读 · 0 评论 -
leetcode232. 用栈实现队列
一:题目二:上码class MyQueue {public: /** 思路:1.设置两个栈,一个In,一个out, 2.模拟入队的话 其实就是 往栈中添加元素 3.模拟出队的话,那么是先进先出的 ,我们需要将in中的元素 导入到 out 中,然后出队的话 其实也就是 out栈中的栈顶元素。 */ stack<int>stIn; stack<int原创 2022-04-28 19:00:11 · 159 阅读 · 0 评论 -
剑指 Offer 05. 替换空格(java双指针)
一:题目二:上码class Solution { /** 思路:1.双指针法进行解决 2.我们先统计出空格的数量,然后再按空格数*2,扩充成字符串,加入到原来的字符串中 3.然后我们定义两个指针 一个是原来数组长度的指针 一个是扩充完数组长度下标的指针 4.当我们原来数组长度的指针遇见空格的时候,这时候,就开始添加 % 2 0 遇见不到就正常赋值原创 2022-04-27 17:28:03 · 583 阅读 · 0 评论 -
leetcode459. 重复的子字符串(KMP)
一:题目二:上码class Solution {public: /** 思路: a b c a b c a b c a b c next[i] 0 0 0 1 2 3 4 5 6 7 8 9 i 0 1 2 3 4 5 6 7 8 9 10 11 length:12 next[length-1]:next[11] = 9 length -原创 2022-04-26 18:54:50 · 207 阅读 · 0 评论 -
leetcode28. 实现 strStr()
一:题目二:上码class Solution {public: /** 思路: 1.KMP算法,主要处理的是字符串匹配的问题 2.这里边需要用到next数组 也就是前缀表;那么我们为什么要用前缀表呢,当我们进行匹配字符的时候 发现匹配到不相同的字符的时候,那么我们就需要在匹配字符串中查询前一个字符所对应的在 前缀表表中的数值,根据数值找到对应的字符 让其重新作为匹配字符串的开始匹配的位置。 3.原创 2022-04-25 21:13:19 · 182 阅读 · 0 评论 -
leetcode151. 颠倒字符串中的单词(思路+详解)
一:题目二:上码class Solution {public: /** 思路: 1.去空格(字符串首部的空格 字符串中间的空格 字符串尾部的空格) 1>:这里的话 我们就用到了双指针去空格 fastindex遇见空格直接跳过 当fastindex遇不见空格,就将值赋值给fastindex; 2.字符串反转 3.将单词反原创 2022-04-22 18:15:49 · 820 阅读 · 2 评论 -
leetcode541. 反转字符串 II
一:题目二:上码class Solution {public: /** 思路: 1.这个我们需要利用到一个库函数 reverse(nums.begin(),nums.end()); // 将字符串反转 那么将局部字符串的反转 reverse(nums.begin(),nums.begin()+2);//表示从nums.begin()开始,然后反转2个字符 2.还有就是原创 2022-04-21 18:23:45 · 757 阅读 · 0 评论 -
leetcode344. 反转字符串
一:题目二:上码class Solution {public: /** 思路:利用双指针来进行处理 */ void reverseString(vector<char>& s) { for (int i = 0,j = s.size()-1; i < j; i++,j--) { swap(s[i],s[j]); } }};...原创 2022-04-21 17:01:30 · 501 阅读 · 0 评论 -
leetcode18. 四数之和
一:题目二:上码class Solution {public: /** 思路: 1.这个跟三数之和差别在于本题加了一层循环,就是我们将第二层循环加在了我们遍历的第一个元素的后面 2.其他跟三数之和解题思路一样 */ vector<vector<int>> fourSum(vector<int>& nums, int target) { vect原创 2022-04-21 16:55:00 · 337 阅读 · 0 评论 -
leetcode15. 三数之和(详解)
一:题目二:上码class Solution {public: /** 思路:1.这个题出其不意之处在于,其先对这个序列进行了排序 排序的好处是 1>:如果首元素是大于0的,那么如果无论无何也凑不出0 2>:同时我们也把相同的元素凑成一块了 可以方便去重了 2.接下来,我们就是利用双指针 来处理 数据是否为0 1>:三个量 数原创 2022-04-20 18:52:25 · 1683 阅读 · 0 评论 -
leetcod383. 赎金信
一:题目二:上码class Solution {public: bool canConstruct(string ransomNote, string magazine) { unordered_map<char,int>m; for (auto ch:ransomNote) { m[ch]++; } for (auto ch: magazine) {原创 2022-04-20 17:23:51 · 205 阅读 · 0 评论 -
leetcode454. 四数相加 II
一:题目二:上码class Solution {public: /** 思路:本题我们是先处理前两个数组,求出两个数组中任意两个元素之和,然后用map容器进行存储, 并记录个数,然后调用find()函数,跟后两个数组中的任意两个元素相加,做差处理, 那么的话,如果等于0,就统计其 value值 (比如 key = 4,那么可能是 1 +3 或者 2 + 2, 这样的话 如果后两个数组有{2,原创 2022-04-20 17:03:53 · 836 阅读 · 0 评论 -
leetcode1. 两数之和
一:题目二:上码class Solution {public: /** 思路:这道题难点是我们并没有先在map容器中进行赋值,而是直接find,虽然第一个值肯定是不存在的 但是我们也进行了相应的处理,那就是插入,如果没有找到相应的结果,我们就把相应的结果进行插入。 */ vector<int> twoSum(vector<int>& nums, int target) { unordered_map原创 2022-04-20 16:31:02 · 207 阅读 · 0 评论 -
leetcode202. 快乐数(详解)
一:题目二:上码class Solution {public: /** 思路: 1.破解这道题的关键是 我们得破解这个无限循环 2.根据这个题目给出的定义2 我们可以知道 无限循环的条件是我们 在计算的过程中出现了自己的数 */ bool isHappy(int n) { unordered_set<int>s; s.insert(n);原创 2022-04-19 18:51:40 · 438 阅读 · 0 评论 -
leetcode349. 两个数组的交集
一:题目二:上码class Solution {public: /** 思路: 利用set容器先将任意一个nums1中的元素存进set容器中, 然后在另一个nums2中 遍历元素 利用 find(nums2[i]) 来查找 nums2[i]中的元素存在于 nums1中 */ vector<int> intersection(vector<int>& nums1, vector<int原创 2022-04-19 18:30:13 · 343 阅读 · 0 评论 -
leetcode242. 有效的字母异位词
一:题目二:上码class Solution {public: /** */ bool isAnagram(string s, string t) { map<char,int>m; map<char,int>::iterator mt; for (int i = 0; i < s.size(); i++) { m[s[i]]++;原创 2022-04-19 17:59:48 · 215 阅读 · 0 评论 -
leetcode142. 环形链表 II(详解)
一:题目二:思路分析三:上码class Solution {public: ListNode *detectCycle(ListNode *head) { ListNode* slow = head; ListNode* fast = head; while (fast != NULL && fast->next != NULL && fast->next->next != N原创 2022-04-19 17:07:23 · 277 阅读 · 0 评论 -
面试题 02.07. 链表相交
一:题目二:上码class Solution {public: /** 思路: 1.因为是指针 所以我们比较指针是否相等就能代表后序序列是否相等。 2.我们需要将链表右对齐后方可继续比较,(因为长链表多余出来的部分是一定不会与短炼表相等) 3.那么我们是如何对齐呢? 求两个链表的长度,然后进行比较, 让长链表的指针指向和短链表一样的长度的位置 */ ListNode *getInters原创 2022-04-18 19:58:14 · 192 阅读 · 0 评论 -
八大排序算法之终章---归并排序
一:简单介绍归并排序排序就是利用归并的思想实现的排序方法它的原理是将初始化序列划分成n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到(n/2)个长度为1或者2的有序子序列;然后再两两合并…不断重复 直到最后 得到一个长度为n的有序序列为止。关键词: 将初始化序列划分成n个记录 每次合并的都是有序序列二:图示详解最后一步的合并:三:上码public class mergeSort1 { public static void main(St原创 2022-04-18 17:43:25 · 560 阅读 · 0 评论 -
leetcode周赛6071. 完成所有任务需要的最少轮数
一:题目二:上码class Solution {public: /** 思路: 1.如果x==1的话,那么的话 直接返回-1 2.如果x==2的话,那么就一次执行 3.如果x是3的倍数的话,那么就直接执行 x/3 次 4.如果x/3 余数是1的话 那就执行 x/3+1,比方说是4 其实是两个2,但是我们求数的的时候,我们求出的是 x/3+1 也是等于2的 再比如7 其实两个2一个3,但是x/3+原创 2022-04-17 16:06:15 · 222 阅读 · 0 评论 -
leetcode周赛6070. 计算字符串的数字和
一:题目二:上码class Solution {public: /** 思路:1.设置一个while循环,循环的条件是s.length<=k 2.while里面进行 1>:将字符串按k个进行拆分成个单个字符,并将其转换成数字,然后计算将计算结果再组成字符串 */ string digitSum(string s, int k) { if (s.size原创 2022-04-17 15:37:49 · 405 阅读 · 0 评论 -
八大排序算法之插入排序
一:直接插入排序1:思想首先选择一个哨兵,我们默认将第一个数作为哨兵,随着循环的进行,我们一直将我们待插入数的前一个数作为哨兵然后就是插入的数与哨兵比较,比哨兵小的话,就将哨兵后移,然后再与哨兵前面的数进行比较,直到遇见一个比起小的的树,停止比较,将要插入树插入到这。大白话就是打扑克,给扑克牌进行排序。2:上码public static void directInsertSort1(int arr[]) { for (int i = 1; i < arr.length; i++原创 2022-04-16 19:02:32 · 557 阅读 · 0 评论 -
leetcode19. 删除链表的倒数第 N 个结点
一:题目二:上码class Solution {public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode*cur1 = head; int count1 = 0; while (cur1) { cur1 =cur1->next; count1++; } in原创 2022-04-15 19:41:37 · 310 阅读 · 0 评论 -
leetcode24. 两两交换链表中的节点
一:题目二:上码class Solution {public: ListNode* swapPairs(ListNode* head) { /** 思路:1.关于结点个数的问题,如果是奇数个的话,我们就不计算最后一个 2.关于如何进行交换,我们是分为三步 我们是定义一个虚拟头节点方便操作 0-1-2-3-4 1>:首先让虚拟头节点执行第二个结点 0-2-3-4原创 2022-04-15 18:25:14 · 316 阅读 · 0 评论 -
leetcode206. 反转链表
再来亿遍反转链表上码class Solution {public: ListNode* reverseList(ListNode* head) { /** 思路:我们反转指针即可 1->2->3->4->5 1<-2<-3<-4<-5 */ ListNode*pre = NULL; ListN原创 2022-04-15 17:05:08 · 180 阅读 · 0 评论 -
leetcode203. 移除链表元素
一:题目二:上码class Solution {public: ListNode* removeElements(ListNode* head, int val) { ListNode* virtuals = new ListNode(-1);//虚拟一个头节点 处理万一要删除的元素是头结点 virtuals->next = head; ListNode* cur = virtuals; while (c原创 2022-04-12 18:47:56 · 246 阅读 · 0 评论 -
八大排序算法之选择排序算法
一:简单选择排序算法1:思想(1):概念总共有n个数,同时下标是从0到n-1;我们要进行n-1趟的交换每一趟在 (n-i)-1个记录中寻找出最小值(也就是找出该数组下标后面数中的最小值),与i下标所代表的值进行比较,如果比其小那么就进行交换(前提我们是求得是升序)。(2):举例验证文字验证第一次从 arr[1]~arr[n-1]中选取最小值,与 arr[0]作比较 判断是否交换第二次从 arr[2]~arr[n-1]中选取最小值,与 arr[1]作比较 判断是否交换第三次从 ..原创 2022-04-12 17:51:28 · 590 阅读 · 0 评论 -
leetcode周赛第一题6037. 按奇偶性交换后的最大数字(冒泡法)
一:题目二:上码class Solution {public: int largestInteger(int num) { string str = to_string(num); for (int i = 0; i < str.size()-1; i++) { for (int j= i+1; j < str.size(); j++) { int num1 = str[j]原创 2022-04-10 17:00:28 · 925 阅读 · 0 评论 -
leetcode904. 水果成篮(滑动窗口)
一:题目二:上码class Solution {public: /** 思路:滑动窗口 1.滑动窗口为我们 两个品种水果的个数 2.滑动窗口的起始位置为数组的起始位置,当遇见一个新的水果种类的时候,这时候就需要移动我们的起始位置 这里移动起始位置是要注意的,我们需要移动起始到我们的窗口中 完全没有 这个品种为止 3.滑动窗口的终止位置为数组下标 */ i原创 2022-04-09 18:51:49 · 258 阅读 · 0 评论 -
leetcode209. 长度最小的子数组(滑动窗口)
一:题目二:上码class Solution {public: /** 思路: 1.滑动窗口解法 1>:确定窗口内是什么 2>:确定窗口的起始位置 3>:确定窗口的终止位置 2.窗口:也就是我们的求的连续字符串的和 3.窗口的起始位置: 窗口的起始位置最先是我们数组的起始位置,当窗口内连续数原创 2022-04-09 16:29:42 · 664 阅读 · 0 评论 -
蓝桥杯- 包子凑数
一:题目题目描述小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有 NN 种蒸笼,其中第 ii 种蒸笼恰好能放 A_iAi 个包子。每种蒸笼都有非常多笼,可以认为是无限笼。每当有顾客想买 XX 个包子,卖包子的大叔就会迅速选出若干笼包子来,使得这若干笼中恰好一共有 XX 个包子。比如一共有 3 种蒸笼,分别能放 3、4 和 5 个包子。当顾客想买 11 个包子时,大叔就会选 2 笼 3 个的再加 1 笼 5 个的(也可能选出 1 笼 3 个的再加 2 笼 4 个的)。当然有时包子大叔原创 2022-04-07 17:35:16 · 258 阅读 · 0 评论 -
蓝桥杯-长草-代码(BFS)
一:题目题目描述小明有一块空地,他将这块空地划分为 nn 行 mm 列的小块,每行和每列的长度都为 1。小明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地。这些草长得很快,每个月,草都会向外长出一些,如果一个小块种了草,则它将向自己的上、下、左、右四小块空地扩展,这四小块空地都将变为有草的小块。请告诉小明,kk 个月后空地上哪些地方有草。输入描述输入的第一行包含两个整数 n, mn,m。接下来 nn 行,每行包含 mm 个字母,表示初始的空地状态,字母之间没有空格。如果为小数点,表原创 2022-04-02 17:45:45 · 286 阅读 · 0 评论 -
蓝桥杯-成绩分析-编程题
一:题目二:上码#include<bits/stdc++.h>using namespace std;int main() { int n; cin >> n; vector<int> v(n,0); for (int i = 0; i < n; i++) { cin >> v[i]; } sort(v.begin(),v.end()); double sum = accumulate(v.begin(),v.en原创 2022-04-01 18:30:06 · 411 阅读 · 0 评论 -
蓝桥杯-排序-填空题
一:题目二:上码#include <iostream>using namespace std;int main(){ // 请在此输入您的代码 /** /** 冒泡排序中:我们考虑到最坏的情况,那就是全都是逆序 那么就需要交换 N(N-1)/2; 那么100次 最起码需要 15个字符, 而15个字符完全逆序的话 需要交换 105次 那么就需要将这105次中我们调换一个字符的位置 来使105次 减少到100次原创 2022-04-01 18:16:48 · 249 阅读 · 0 评论 -
蓝桥杯-卡片-填空题
一:题目二:思路1是最快消耗完的计算1的个数即可三:上码#include <iostream>using namespace std;int main(){ int ans = 0; int count = 0; for(int i = 1; i < 20000; i++) { string str = to_string(i); // cout << str << endl; for(int j = 0; j &l原创 2022-04-01 16:51:54 · 119 阅读 · 0 评论 -
leetcode剑指 Offer 29. 顺时针打印矩阵
一:题目二:上码class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) { //判空处理 否则会出现空指针异常 if(matrix.size() == 0 || matrix[0].size() == 0){ return {}; } in原创 2022-03-31 19:37:20 · 806 阅读 · 0 评论