LeetCode 刷题
文章平均质量分 79
重刷LeetCode,记录自己的解法,分析大佬的思路
猿六凯
这个作者很懒,什么都没留下…
展开
-
字符串查找---用16幅图从暴力一步步优化到KMP
猿六热衷于探求算法原理,知其然并知其所以然。研究了整整一周字符串匹配问题,总算搞明白了如何从暴力算法一步步优化得到KMP算法,高兴的想去打会游戏放松下。突然接到了面试官的电话。**面试官:**猿同学,看你简历上说熟悉算法,把我当成一个小白,来给我讲讲字符串查找的KMP算法。猿六:要不要开个视频,这个算法比较复杂,视频讲会好理解一些。**面试官:**我没准备摄像头。 你先给我讲讲,下次面试,再来个视频版本的。**猿六:**好的,那我就从暴力解法一步步优化到KMP。**猿六:**我先来解释一下字符串查原创 2020-12-17 20:46:07 · 260 阅读 · 0 评论 -
面试高频:栈--3题多动图1模板把栈讲明白
猿六今天复习完栈的相关知识,打算玩会游戏放松一下,突然接到面试官的电话,急忙跑到厕所接听。面试官:猿同学,你简历上说熟悉数据结构,说说你对栈的理解。猿六:先进后出,后进先出,就像羽毛球桶一样,桶口的羽毛球先被用,里面的羽毛球后被用。面试官:你来用数组实现下栈,功能有:进栈,出栈,求栈顶元素,判断栈是否为空。面试官:假设最多做10W次进栈出栈操作,所有操作合法。猿六:具体过程如下:初始化:数组stk保存元素,从stk[1]开始存储。top指向栈顶元素,栈为空的时候,top = 0.判断栈是否原创 2020-12-11 22:11:51 · 165 阅读 · 0 评论 -
Leetcode 11. 盛最多水的容器 从暴力优化到双指针,明明白白
从暴力优化到双指针,明明白白这道题的最优解法是左右双指针法。双指针法的难点在于难于想到,难以证明。接下来将一步一步地从暴力解法优化到双指针法。证明也就很简单了。暴力解法找出每一种情况,求出盛水值,最大的就是答案。i指向左挡板,从第一块到遍历倒数第二块。j指向右挡板,从倒数第一块遍历到i后面那一块。res保存最大盛水值。返回res。代码://cpp#include <iostream>#include <vector>using namespace std;原创 2020-12-10 22:56:51 · 232 阅读 · 0 评论 -
面试必会:双指针---6题14图一次搞懂
面试必会:双指针—6题20图一次搞懂使用双指针是降低算法复杂度的一个有效途径,有些问题的暴力解法时间复杂度是O(n^2),但使用双指针可以大幅度降低算法复杂度。如果面试者能将求解过程从暴力法优化到双指针,说明面试者的基础知识、代码能力、逻辑思维都是十分扎实的。同贪心算法一样,双指针的难点在于自己想不出、别人的理解不了、正确性难以证明。常用的双指针法有一下几类:左右指针:两个指针,相向而走,中间相遇。快慢指针:两个指针,有快有慢,同向而行。灵活运用:两个指针,灵活运用,伺机而动。原创 2020-12-10 21:25:46 · 527 阅读 · 1 评论 -
面试高频:二分法,多题多图,一次讲个明白
基础算法一:二分法,你思考过这些问题吗?如何优雅的处理边界条件?一定要数据有序时才能使用二分吗?如何优雅的证明二分法的时间复杂度是O(logn)?如果这几个问题你已经完全掌握了,可以点击右上角关闭。如果想听听我的心得,请读完下面内容。1. 什么是二分法? 二分法(Bisection method),即一分为二的的方法。对于在区间[a,b]上连续不断且满足f(a)*f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在区间二等分,使区间两个端点逐步逼近零点,进而得到零点的近似值原创 2020-11-23 18:21:18 · 1156 阅读 · 0 评论 -
[LeetCode] 5503. 所有奇数长度子数组的和 普通解法和大神解法
给你一个正整数数组 arr ,请你计算所有可能的奇数长度子数组的和。子数组 定义为原数组中的一个连续子序列。请你返回 arr 中 所有奇数长度子数组的和 。首先,力扣比赛第一题通常无脑暴力都能过。我们只需要枚举所有的奇数长度的子数组即可。在下面的代码中,i 用来枚举每个连续子数组的起点,sz 为连续子数组的长度。accumulate用来计算起点是 i,长度为 sz 的子数组的和。时间复杂度是 O(n^3) 的。我的参考代码(C++):class Solution {public:int s原创 2020-09-20 23:34:04 · 396 阅读 · 0 评论 -
【LeetCode】1486. 数组异或操作 普通解法和大神解法
【LeetCode】1486. 数组异或操作给你两个整数,n 和 start 。数组 nums 定义为:nums[i] = start + 2*i(下标从 0 开始)且 n == nums.length 。请返回 nums 中所有元素按位异或(XOR)后得到的结果。class Solution {public: int xorOperation(int n, int start) { int res = 0; for(int i = 0; i < n;原创 2020-09-18 21:26:05 · 163 阅读 · 0 评论 -
【LeetCode】1470. 重新排列数组 普通解法和大神解法
【LeetCode】1470. 重新排列数组 普通解法和大神解法普通解法大神解法给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,…,xn,y1,y2,…,yn] 的格式排列。请你将数组按 [x1,y1,x2,y2,…,xn,yn] 格式重新排列,返回重排后的数组。普通解法用一个新vecotr保存结果,0-n,n-2*n轮流放入。class Solution {public: vector<int> shuffle(vector<int>&原创 2020-09-18 21:17:13 · 685 阅读 · 0 评论 -
[LeetCode] 1431. 拥有最多糖果的孩子 普通解法和大神解法
[LeetCode] 1431. 拥有最多糖果的孩子给你一个数组 candies 和一个整数 extraCandies ,其中 candies[i] 代表第 i 个孩子拥有的糖果数目。对每一个孩子,检查是否存在一种方案,将额外的 extraCandies 个糖果分配给孩子们之后,此孩子有 最多 的糖果。注意,允许有多个孩子同时拥有 最多 的糖果数目。找出最大的糖果数,用每一个孩子的糖果数加上额外糖果数,若大于等于最大糖果数,则在输出中增加true,否则增加false.class Solution原创 2020-09-17 18:19:23 · 190 阅读 · 0 评论 -
[LeetCode] 1512. 好数对的数目 普通解法和大神解法
[LeetCode] 1512. 好数对的数目一般解法大神解法给你一个整数数组 nums .如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。返回好数对的数目。一般解法用ans保存好数对个数。连个循环,外层从nums[0]到倒数第二个元素,内层循环从外层循环到最后一个元素,若相等,则ans+1。返回ans。class Solution {public: int numIdenticalPairs(vector原创 2020-09-17 18:02:36 · 145 阅读 · 0 评论 -
1480. 一维数组的动态和 普通解法和大神解法
LeetCode 1480. 一维数组的动态和给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i]) 。请返回 nums 的动态和。来源:力扣(LeetCode)解题思路:动态和就是从第一个数加到当前位置数,结果保存起来,组合起来输出。用初始值为0的临时变量保存前面位置的和,加上当前位置的数值,遍历nums,保存起来即可。可以使用如代码中的vector的遍历方法,简约。class Solution {public:原创 2020-09-16 22:34:56 · 149 阅读 · 0 评论