算法
文章平均质量分 50
1
头号理想
四面佛保佑
展开
-
【LeetCode二分查找】1283.使结果不超过阈值的最小除数&875.爱吃香蕉的珂珂
1283.使结果不超过阈值的最小除数给你一个整数数组 nums 和一个正整数 threshold ,你需要选择一个正整数作为除数,然后将数组里每个数都除以它,并对除法结果求和。请你找出能够使上述结果小于等于阈值 threshold 的除数中 最小 的那个。每个数除以除数后都向上取整,比方说 7/3 = 3 , 10/2 = 5 。题目保证一定有解。这个题目不是很复杂 只需要在一个区间之内找到一个最合适的值 返回即可所以我就用暴力尝试了一下 结果不出意料 超时 int smallestDiv原创 2021-02-12 21:24:03 · 156 阅读 · 0 评论 -
滑动窗口同数组的结合(LeetCode 438.找到字符串中所有字母异位词&567.字符串的排列)
不就之前我写过一个关于滑动窗口的博文,其中是一些力扣中可以使用滑动窗口的方法解决的问题地址:点这里!然后今天又发现两个同类的问题 是使用数组和滑动窗口结合的问题567.字符串的排列这个题是2.10的每日一题给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。换句话说,第一个字符串的排列之一是第二个字符串的子串。由题意我们知道 这个题不是和普通的滑动窗口一样这个题判断的是 给定的字符串的排列 所以这点就值得我们思考使用什么方法去处理由于字符的特殊的特征 我们可以原创 2021-02-10 15:26:13 · 169 阅读 · 0 评论 -
【LeetCode】单调栈合集
单调栈也是很常见的一种数据结构 在刷一些特定的题的时候 可以起到很好的效果962 最大宽度坡给定一个整数数组 A,坡是元组 (i, j),其中 i < j 且 A[i] <= A[j]。这样的坡的宽度为 j - i。找出 A 中的坡的最大宽度,如果不存在,返回 0 。暴力我试过了 超时 卡了四个用例(O(n^2)) 留下了不争气的口水所以暴力的代码我也不贴了 丢人 直接用单调栈从上边图可以看出 首先我们先正向遍历一遍数组 创建一个单调递减栈如果当前栈为空或者是 当前元素小于栈原创 2021-02-06 21:30:56 · 253 阅读 · 0 评论 -
【LeetCode】和为奇数的子数组数目
题目给你一个整数数组 arr 。请你返回和为 奇数 的子数组数目。由于答案可能会很大,请你将结果对 10^9 + 7 取余后返回。这个题看上去也不难吧 充其量也就是几层循环就搞定了但是那就难在时间复杂度上我们用三层循环可以很轻松的解决但是用脚都能想到会超时然后我又尝试了两层循环 不出意外 超时 int numOfSubarrays(vector<int>& arr) { vector<int> nums; int ans = 0; for (int原创 2021-02-05 21:09:06 · 599 阅读 · 0 评论 -
【LeetCode滑动窗口】最大连续1的个数&替换后的最长重复字符&尽可能使字符串相等&k个不同整数的子数组
最大连续1的个数给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。返回仅包含 1 的最长(连续)子数组的长度。思路我们使用双指针,也就是滑动窗口的方法来解这两个题我们的思路是 让后指针一直往后移动 同时每移动一次 统计一次当前不符合条件的元素的个数当不符合条件的元素个数超过给定k的时候,我们让前指针向后移动直至不符合条件的个数小于等于k 继续让right向后移动依次进行 直至right到达数组的末尾上边我画了一个简单的示意图 也是希望大家可以看懂原创 2021-02-02 10:25:47 · 1881 阅读 · 3 评论 -
【LeetCode】满足三个条件之一需改变的最少字符数
题目给你两个字符串 a 和 b ,二者均由小写字母组成。一步操作中,你可以将 a 或 b 中的 任一字符 改变为 任一小写字母 。操作的最终目标是满足下列三个条件 之一 :a 中的 每个字母 在字母表中 严格小于 b 中的 每个字母 。b 中的 每个字母 在字母表中 严格小于 a 中的 每个字母 。a 和 b 都 由 同一个 字母组成。返回达成目标所需的 最少 操作数。这个题是力扣周赛上的一个题 刚看到的时候 没有思路 然后看题解的思路用哈希表模拟实现首先使用哈希表统计两个字符串的所有的原创 2021-01-29 17:26:28 · 317 阅读 · 0 评论 -
【LeetCode前缀和】560. 和为k的数组&1248.统计【优美子数组】&525.连续数组&523.连续的子数组和
题目给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。我现在是发现了题目越简单 题好像就越难呀O(n^3)的暴力(超时)看到这个题开始没有其他头绪 然后就想着暴力看看能卡多少用例 int subarraySum(vector<int>& nums, int k) {int ans = 0; for (int i = 0; i < nums.size(); i++) { for (int j = i + 1; j <=原创 2021-01-26 11:27:21 · 138 阅读 · 0 评论 -
【LeetCode】验证外星语词典
题目某种外星语也使用英文小写字母,但可能顺序 order 不同。字母表的顺序(order)是一些小写字母的排列。给定一组用外星语书写的单词 words,以及其字母表的顺序 order,只有当给定的单词在这种外星语中按字典序排列时,返回 true;否则,返回 false。排序cmp刚开始我是想写一个cmp方法 然后放在sort中排序 对比结果的然后发现sort中的cmp的参数不能乱放最后只能执行一次循环 比较两两之间的正确性因为如果两两之间正确 他是不可能产生跨越错误的//2021.1.22原创 2021-01-22 11:05:43 · 193 阅读 · 0 评论 -
【LeetCode】三维型体的投影面积和表面积
今天刷题刷到两个特别有意思的题三维型体的投影面积在 N * N 的网格中,我们放置了一些与 x,y,z 三轴对齐的 1 * 1 * 1 立方体。每个值 v = grid[i][j] 表示 v 个正方体叠放在单元格 (i, j) 上。现在,我们查看这些立方体在 xy、yz 和 zx 平面上的投影。投影就像影子,将三维形体映射到一个二维平面上。在这里,从顶部、前面和侧面看立方体时,我们会看到“影子”。返回所有三个投影的总面积。这个我是一遍过的 我们遍历数组的同时 一直动态获取最大值即可 in原创 2021-01-21 11:33:30 · 562 阅读 · 0 评论 -
【LeetCode】非递减序列
题目给你一个长度为 n 的整数数组,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。我们是这样定义一个非递减数列的: 对于数组中所有的 i (0 <= i <= n-2),总满足 nums[i] <= nums[i + 1]。贪心我们只有一次可以修改数组元素的机会 但是这里有一个修改的值为多少的问题我们只有两种方式去修改1.nums[i]=nums[i+1]2.nums[i+1]=nums[i]但是这两种方法也都是有不足的地方的下面我给出两个极原创 2021-01-19 17:17:27 · 627 阅读 · 0 评论 -
【面试题】连续数列(最大子序和)
题目给定一个整数数组,找出总和最大的连续数列,并返回总和这个题我就不尝试用暴力解了 用脚都能想到 肯定会超时贪心我们遍历一次数组 始终维护一个当前的值 如果当前的值小于0 则我们就把起点弄到下一个位置上int maxSubArray(vector<int>& nums) { int ans = INT32_MIN; int cur = 0; for (int i = 0; i < nums.size(); i++) { cur += nums[i]; i原创 2021-01-19 15:05:31 · 157 阅读 · 0 评论 -
【LeetCode】二叉树的堂兄弟节点
题目在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。如果二叉树的两个节点深度相同,但父节点不同,则它们是一对堂兄弟节点。我们给出了具有唯一值的二叉树的根节点 root,以及树中两个不同节点的值 x 和 y。只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true。否则,返回 false。虽然是个简单题 但是也花了我好多的时间因为刚开始我想写一个方法 寻找输入节点的父节点 但是失败了于是只能转变思路使用层序遍历(广度优先)然后如果发现两个值在同原创 2021-01-18 22:07:16 · 228 阅读 · 0 评论 -
【LeetCode】二进制求和
题目给你两个二进制字符串,返回它们的和(用二进制表示)。输入为 非空 字符串且只包含数字 1 和 0。傻乎乎的计算刚看到这个题的时候,我就想先把二进制的string的值转换成十进制然后计算结果之和 然后在转换成string类型 最后返回但是有好多用例是过不去的int getten(string& num) { //二进制字符串转换成十进制数字 int ans = 0; int count = 1; for (int i = num.size() - 1; i >= 0;原创 2021-01-16 18:03:46 · 204 阅读 · 0 评论 -
【LeetCode】两数相加(一二)
两数相加(一)给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。有题意可知 我们正向遍历两个链表,然后设置一个值当做进位值ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode* ans = new ListNode(-1); Li原创 2021-01-16 16:52:44 · 309 阅读 · 0 评论 -
【LeetCode】最大网络秩
题目n 座城市和一些连接这些城市的道路 roads 共同组成一个基础设施网络。每个 roads[i] = [ai, bi] 都表示在城市 ai 和 bi 之间有一条双向道路。两座不同城市构成的 城市对 的 网络秩 定义为:与这两座城市 直接 相连的道路总数。如果存在一条道路直接连接这两座城市,则这条道路只计算 一次 。整个基础设施网络的 最大网络秩 是所有不同城市对中的 最大网络秩 。给你整数 n 和数组 roads,返回整个基础设施网络的 最大网络秩 。刚开始我用暴力试了一下 不出所料 超时了原创 2021-01-16 11:15:51 · 471 阅读 · 0 评论 -
【LeetCode】最接近的三数之和(三数之和)
题目给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。暴力int threeSumClosest(vector<int>& nums, int target) { vector<int> sums; for (int i = 0; i < nums.size()-2; i++) { for (int j = i + 1;原创 2021-01-15 15:24:36 · 238 阅读 · 0 评论 -
【面试题】二叉树中和为某一值的路径
做这个题之前我们首先做一个相似的题目题目给定一个二叉树,返回所有从根节点到叶子节点的路径。说明: 叶子节点是指没有子节点的节点。我们使用递归的方法来解决void dfs(TreeNode* root, string path, vector<string>& ans) { if (root == NULL) { return; } path += to_string(root->val); if (root->left == NULL &&原创 2021-01-14 10:53:19 · 162 阅读 · 0 评论 -
【LeetCode】N叉树的前后遍历外加层序遍历
力扣中分为三个题然后其实N叉树和二叉树是一样的,只是N叉树将左右节点换成了一个数组仅此而已所以使用递归的方法真的很简单的可以实现前后遍历因为数组的原因 所以我们没法进行中序遍历(无法知道插入到什么位置去)先序遍历void dfs(Node* root, vector<int>& nums) { if (root == NULL) { return; } nums.push_back(root->val); for (auto t : root->ch原创 2021-01-13 15:41:11 · 86 阅读 · 0 评论 -
【LeetCode】相交链表
题目我们可以把两个链表看成两个数组,然后判断相交的地方暴力我们遍历两次数组,两层嵌套循环 ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { ListNode* ta = headA; while (ta != NULL) { ListNode* tb = headB; while (tb != NULL) { if (ta == tb) { return ta; }原创 2021-01-10 20:00:18 · 114 阅读 · 1 评论 -
【LeetCode】汇总区间
题目给定一个无重复元素的有序整数数组 nums 。返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。列表中的每个区间范围 [a,b] 应该按如下格式输出:“a->b” ,如果 a != b“a” ,如果 a == b分成数组 然后得值(超时)我自己写了一个方法,将输入的一个数组,返回一个二维数组其中每个数组都按要求分开vector<vector<in原创 2021-01-10 09:42:37 · 101 阅读 · 0 评论 -
【LeetCode】二叉搜索树中的众数
题目给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。假定 BST 有如下定义:结点左子树中所含结点的值小于等于当前结点的值结点右子树中所含结点的值大于等于当前结点的值左子树和右子树都是二叉搜索树暴力数组哈希看到这个题 我首先想到的就是 遍历二叉树然后将所有节点的值都放在一个驻足中然后通过哈希表两次遍历数组 得到众数(当然排序也可以用其他的办法)这个方法的时间复杂度是O(N)但是我这里不仅用到了哈希表还用到了set所以空间复杂度消耗比较大原创 2021-01-06 17:13:22 · 255 阅读 · 0 评论 -
【面试题】最小的k个数
题目输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。看到即想到的解法看到这个题就想到了sort但是如果面试的时候和面试官说sort可能你就中奖了 vector<int> getLeastNumbers(vector<int>& arr, int k) { sort(arr.begin(), arr.end()); arr.resize(k); retur原创 2021-01-04 11:23:49 · 117 阅读 · 0 评论 -
经典排序查找算法(c++版本)
冒泡排序冒泡排序是最最基础的一个排序方法重复走访相邻的元素,一次比较两个,如果顺序不符合要求就返过来算法复杂度O(N^2)vector<int> bubbleSort(vector<int> nums) { for (int i = 0; i < nums.size(); i++) { for (int j = i; j < nums.size() - 1 -i; j++) { if (nums[j] > nums[j + 1]) { i原创 2021-01-04 10:53:43 · 529 阅读 · 0 评论 -
【LeetCode】验证回文字符串2
题目给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串题解因为我们可以删除一个字符我们还是采用双指针的方法但是一旦我们检测到两个字符不相同 我们可以检测两个子字符串是否为回文如果有一个为回文 则整个字符串为回文如果两个都不是回文,则整个字符串就不是回文如果字符串是abcctba则两个子串就是cc和ct可见cc是回文串所以我们就可以把t删除代码bool isValid(string s,int left,int right) { while (left <原创 2021-01-03 10:35:58 · 167 阅读 · 0 评论 -
【面试题】从上向下打印数组|||
题目请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。判断奇偶翻转数组根据题目就是翻转一部分返回的答案其他的内容和从上打印数组||的内容一样我自己写了一个翻转数组的方法然后判断奇偶性 在合适的时机翻转返回的数组即可void reverse(vector<int> &a) { int left = 0; int right = a.size() - 1; while原创 2021-01-02 17:47:01 · 141 阅读 · 1 评论 -
【面试题】从上到下打印二叉树||
题目从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。层序遍历(广度优先)这个题和【面试题】从上到下打印二叉树(二叉树的层序遍历)解法很相似只是输出多了一个层vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> ans; if (root == NULL) { return ans; } queue<TreeNode* &原创 2021-01-02 17:18:58 · 128 阅读 · 0 评论 -
【面试题】从上到下打印二叉树(二叉树的层序遍历)
题目从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。层序遍历这个题的实质也就是二叉树的层序遍历,需要一个辅助队列来实现vector<int> levelOrder(TreeNode* root) { queue<TreeNode*> q; vector<int> ans; if (root == NULL) { return ans; } q.push(root); while (!q.empty()) { TreeNod原创 2021-01-02 16:45:25 · 215 阅读 · 0 评论 -
【面试题】栈的压入,弹出队列
题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列我自己的一个栈一个队列实现因为栈和队列的性质栈是后进先出,队列是先进先出所以我们正好可以利用这两个性质,对应题目给出来的两个数组进行操作首先我们把popped里边的所有值压入一个队列中,由于队列的性质,出队原创 2021-01-02 11:04:38 · 241 阅读 · 0 评论 -
【牛客】判断一个链表是否为回文链表
题目给定一个链表,请判断该链表是否为回文结构。将数据存入数组中我们很简单粗暴的一种办法,就是将数组遍历一次把里边所有的值都填入到一个数组中然后从数组中判断是否是回文的我这里判断是否回文用的是双指针的方法bool isPail(ListNode* head) { vector<int> num; ListNode* p = head; while (p != NULL) { num.push_back(p->val); p = p->next; } /原创 2021-01-01 17:05:22 · 288 阅读 · 0 评论 -
【面试题】链表中倒数第K个节点
题目输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。正向计数我们可以思考一下倒数第K个节点,其实就是正数第(链表长度)- k个节点所以我们的思路就是先遍历一次链表,求出长度然后计算出答案要求节点正向的位次输出即可 ListNode* p = pListHead; int length = 0;//长度原创 2021-01-01 16:21:58 · 225 阅读 · 0 评论 -
【面试题】二叉搜索排序树(二叉树)的最近公共祖先
题目给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]两次遍历由于这个树是二叉搜索树它的性质就是左子树上所有值小于根节点右子数上所有的值都大于根节点我们从根节点遍历,先找出题目中给出的两个节点原创 2020-12-31 13:45:49 · 352 阅读 · 0 评论 -
【LeetCode】可被K整除的子数组
题目给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续、非空)子数组的数目。时间复杂度O(N^3)的暴力(超时)int subarraysDivByK(vector<int>& A, int K) { int ans = 0; for (int i = 0; i < A.size(); i++) { for (int j = i; j < A.size(); j++) { int sum = 0; for (int k = i; k &l原创 2020-12-31 10:13:36 · 527 阅读 · 3 评论 -
【LeetCode】单词规律
题目给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。这个题用一个哈希表和一个set就可以解决//将字符串分隔开vector<string> ReturnString(string s) { vector<string> ans; int start = 0; for (int i = 0; i <原创 2020-12-30 17:14:29 · 105 阅读 · 0 评论 -
【LeetCode】最后一块石头的重量(最大堆)
题目有一堆石头,每块石头的重量都是正整数。每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果 x == y,那么两块石头都会被完全粉碎;如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0。循环排序这个解法就是循环排序,特别消耗性能 int lastStoneWeight(vector原创 2020-12-30 09:58:05 · 287 阅读 · 0 评论 -
【数据结构——二叉树】(其他树的种类)
当时大一上课没有好好学,现在追悔莫及,因为面试需要数据结构的知识,所以只能补上去了还是建议大家像这样考研和工作都要用到的知识还是在上课的时候好好学然后之后也会轻松一些二叉树的基本操作我这里用的c++语言有一些面相对象基础的朋友们都可以看懂的节点类class Node { public : int key;//位置 int value;//值 Node* leftchild; Node* rightchild; Node (int key, int value) { this-原创 2020-12-29 17:27:36 · 223 阅读 · 0 评论 -
【LeetCode】合并K个升序链表
题目(困难)给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。暴力解法(可通过)我们遍历所有的链表,把所有的值都存在一个数组中将数组排序然后创建一个链表,把数组中每个元素一次填入链表中即可ListNode* mergeKLists(vector<ListNode*>& lists) { vector<int> later; for (auto list : lists) { Lis原创 2020-12-29 10:24:52 · 482 阅读 · 0 评论 -
【LeetCode】最佳观光组合
题目给定正整数数组 A,A[i] 表示第 i 个观光景点的评分,并且两个景点 i 和 j 之间的距离为 j - i。一对景点(i < j)组成的观光组合的得分为(A[i] + A[j] + i - j):景点的评分之和减去它们两者之间的距离。返回一对观光景点能取得的最高分。暴力求解(超时)我们直接模拟运算,直接双重循环遍历出最后结果 int maxScoreSightseeingPair(vector<int>& A) { int ans = 0; for原创 2020-12-28 17:13:41 · 147 阅读 · 1 评论 -
【LeetCode】买股票的最佳时机
题目给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。暴力求解(用例超时)直接双重循环,遍历所有结果 取最大int maxProfit(vector<int>& prices) { int ans = 0; for (int i = 0; i < prices.size(); i++) { f原创 2020-12-28 16:33:26 · 143 阅读 · 0 评论 -
【LeetCode】合并两个有序链表
题目将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。迭代当L1和L2都是不为空的时候,我们判断两个链表的两个头结点哪个更小,将较小的值添加到结果里,当这个结点被添加到结果里时 该链表中的指针向后移动一位如果其中一个链表为空的话,我们直接将另一个链表后边所有接上去即可 public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode prehead = new Li原创 2020-12-28 11:02:10 · 247 阅读 · 0 评论 -
【LeetCode】除自身以外数组的乘积
题目给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。超时解法时间复杂度为O(n^2)vector<int> productExceptSelf(vector<int>& nums) { vector<int> ans; for (int i = 0; i < nums.size(); i++) { int te原创 2020-12-27 20:31:44 · 108 阅读 · 0 评论