leetCode
工作面试刷题必备!
繁星蓝雨
Happy coding!
展开
-
2006. Count Number of Pairs With Absolute Difference K(的绝对值为 K 的数对数目)————附带详细代码和解析
文章目录0 效果1 题目2 思路2.1 思路12.2 哈希3 代码3.1 思路13.2 思路20 效果1 题目2 思路2.1 思路1暴力枚举2.2 哈希数组(hash)统计向量中每个元素出现的个数,然后i从1到i+k<101开始遍历,结果集等于累加hash[i]*hash[i+k]的和。3 代码3.1 思路1class Solution {public: int countKDifference(vector<int>& nums, int k)原创 2022-12-26 22:30:34 · 970 阅读 · 0 评论 -
141. 环形链表———附带详细代码和思路
文章目录1 题目2 思路2.1 思路一2.2 思路二3 代码3.1 代码13.2 代码21 题目2 思路2.1 思路一使用哈希表存储每次遍历后的指针的地址,遍历链表,如果遍历结束前,发现哈希表中已存在目前遍历的指针地址,就返回false,否则返回true。2.2 思路二摘自官网解说3 代码3.1 代码1class Solution {public: bool hasCycle(ListNode *head) { unordered_set<ListNod原创 2022-03-23 22:30:00 · 1331 阅读 · 0 评论 -
283. 移动零——附带详细代码和思路
文章目录1 题目2 思路3 代码1 题目2 思路思路1:如果遇到0,就是删除,然后再末尾再加上0。⚠️注意点:如果删除元素后,会使得删除元素后的迭代器失效,删除元素后,会返回删除后的那个迭代器。思路2:所有非零元素都向前覆盖前面的元素,把没有覆盖后的元素全部赋值为0.3 代码class Solution {public: void moveZeroes(vector<int>& nums) { int len = nums.size(原创 2022-03-19 20:00:00 · 231 阅读 · 0 评论 -
20. 有效的括号————附带详细思路和代码
文章目录0效果1 题目2 思路3 代码0效果1 题目2 思路如果字符串是奇数位,肯定存在不匹配的括号,返回false;如果字符串是偶数位,遇到左括号就进栈,遇到右括号,如果和栈顶的左括号匹配,栈顶元素出栈,如果不匹配,返回false,最后如果栈为空,证明括号是完全匹配的,返回true,否则返回false。官方版答案,使用pair来判断括号是否匹配,可以少写很多if-else的代码。想法让人眼前一亮。最后返回栈是否为空,也简化了对返回结果的判定。3 代码class Solution {pu原创 2022-03-18 23:15:00 · 480 阅读 · 0 评论 -
162. 寻找峰值———附带思路和详细代码
文章目录1 题目2 思路3 代码1 题目2 思路使用二分查找来遍历向量,如果该点大于左、右点两个位置的,就返回该值;如果该点小于左相邻点的值,那么峰值一定在左半边的区域(因为-1和n都是-∞;同理,如果该点小于右相邻点的值,那么峰值在右半边的区域),区域缩小为左半区间,剩余的情况,让区间缩小到右半区间。如果该点为第一个点或者最后一个点,为了方便比较,使用pair作为比较对象,first值除了位置-1和n的值为0外,其余的都为1,second值为nums[i]实际值,这样就可以让位置-1和n都是恒小原创 2022-03-18 22:15:00 · 931 阅读 · 0 评论 -
2. 两数相加————附带详细代码和运行实例代码
文章目录1 题目2 思路3 代码4 实例1 题目2 思路遍历链表,逐位进行累加,每次记录进位数,加入到下一位的累加中,模拟加法运算,边累加边使用尾插法,进行结果链表的创建,最后返回结果链表。3 代码class Solution {public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { //ListNode* ans = (ListNode*) malloc(sizeof(ListNode));原创 2022-03-15 23:30:00 · 2060 阅读 · 1 评论 -
1.两数之和————附带详细代码和思路
文章目录1 题目2 思路3 代码3.1 法一3.2 法21 题目2 思路如果直接暴力求解,两个for循环,内存循环和外层循环遍历的数字相加,然后判断值是否等于target,但是时间复杂度为O(n^2),如果这样写是超时的。法1:1,首先使用哈希表map<string, int>存储向量(变长数组)中每个值的位置,如果遇到两个值相同的情况,就判断2倍的值是否等于target,不等时,继续存储,直至全部存入哈希表中【记录排序前的元素位置】;2,对向量进行增量排序;3,逆向遍历排序后原创 2022-03-14 23:15:00 · 597 阅读 · 0 评论 -
1022. 从根到叶的二进制数之和(计算所有根节点到叶结点的路径)————附带详细讲解和实例
文章目录1 题目2 思路3 代码1 题目2 思路题目的大意就是求树根节点到叶子结点的路径,然后根据路径上的权值求出每条路径的值,最后累加得到所有路径的值。求路径,使用先序遍历,每次记录遍历到的每层节点,当该节点的左右孩子均为空时,该节点为叶子节点,计算路径值。3 代码1,depth方法中,每次value值,都逐层累加计算路径值。2,depth2方法2中,每次记录路径值,当遇到叶节点时,计算路径值。class Solution {public: int res = 0;原创 2022-03-11 16:50:51 · 1568 阅读 · 0 评论 -
797. 所有可能的路径(图打印两点之间的所有路径)————附带详细代码
文章目录0 结果1 题目2 思路3 代码0 结果1 题目2 思路使用深度搜索(DFS)图,从0开始出发,一边遍历一边把顶点存入到临时路径中,如果遍历到目的点n-1,则把临时路径存入到答案路径ans中;如果从0开始遍历到产生递归回退的时候(即退栈的时候,在图中的含义就是该顶点所连的顶点都已被访问过),每回退一次(每弹出一个顶点),把该顶点重新置为未访问,以便后面其他路径访问。3 代码class Solution {public: vector<vector<in原创 2022-01-28 21:30:00 · 1019 阅读 · 1 评论 -
1971. 寻找图中是否存在路径————附带详细代码
文章目录0 结果1 题目2 思路3 代码0 结果1 题目2 思路使用DFS算法(深度遍历算法),仅加入源点,然后使用DFS从该点遍历,如果途中遍历到目的点,那就说明源点到目的点存在路径。3 代码#include <iostream>#include <vector>#include <cstdlib>using namespace std;class Solution {public: bool validPath(int n, vec原创 2022-01-27 22:30:00 · 1053 阅读 · 0 评论 -
881. Boats to Save People(救生船)———附带思路和完整代码
文章目录0 效果1 题目2 思路3 代码0 效果1 题目2 思路首先排序船员体重,然后使用双指针法,分别指向容器的首和尾进行循环,如果首和尾值的和大于limit,则有一个队员一定要单独乘船,否则,两个队员一起乘船,当两个指针指向相同位置时,意味着只有一个船员,该船员乘船,结束循环,输出结果。3 代码class Solution {public: int numRescueBoats(vector<int>& people, int limit) {原创 2021-12-15 23:00:00 · 312 阅读 · 0 评论 -
976. Largest Perimeter Triangle(三角形的最大周长)———附带思路和完整代码
文章目录0 效果1 题目2 思路3 代码0 效果1 题目2 思路因为需要得到最大的周长,因此我们先将边长向量按增量排序,然后逆序比较相邻的三个元素的值是否满足三角形的判定条件(两边之和大于第三边),只要满足则输出,否则输出。3 代码class Solution {public: int largestPerimeter(vector<int>& nums) { sort(nums.begin(), nums.end()); for原创 2021-12-15 21:00:00 · 254 阅读 · 0 评论 -
539. Minimum Time Difference(最小时差)———附带思路和完整代码
文章目录0 效果1 题目2 思路3 代码0 效果1 题目2 思路把时间转换为分钟存储在容器中并排序,依次比较每个相邻元素并记录最小值,最后与特殊处理时间循环交接处的值进行比较得到结果。时间循环交界处的值为60*24 - 最大的时间点的分钟数(例如:23:40) + 最小的时间点的分钟数(例如:2:00)得到循环交界处的值。3 代码C++:class Solution {public: int findMinDifference(vector<string>&原创 2021-12-14 23:30:00 · 497 阅读 · 0 评论 -
905. Sort Array By Parity(按奇偶排序数组)———附带思路和完整代码
文章目录0 效果1 题目2 思路3 代码0 效果1 题目2 思路因为cmp返回值小于1的排在前面,因此只需要让两个比较的值的差(偶数恒小于奇数)就可以,让数与1做&操作,这样偶数的结果都是0,奇数的结果都是1。3 代码C:int cmp2(int n){ return n&1;}int cmp(const void* p1, const void* p2){ return cmp2(*(int*)p1) - cmp2(*(int*)p2);}in原创 2021-12-14 17:39:46 · 377 阅读 · 0 评论 -
164. Maximum Gap(最大间距)———附带思路和完整代码
文章目录0 效果1 题目2 思路3 代码0 效果1 题目2 思路朴素算法,先处理特殊情况,然后排序序列,依次比较两个相邻元素的差值并记录最大值。3 代码int cmp(const void* p1, const void* p2){ return *(int*)p2 - *(int*)p1;}int maximumGap(int* nums, int numsSize){ if(numsSize < 2) return 0; if(numsSize ==原创 2021-12-15 06:45:00 · 293 阅读 · 0 评论 -
217. Contains Duplicate(存在重复元素)———附带思路和完整代码
文章目录0 效果1 题目2 思路3 代码0 效果1 题目2 思路排序后,以此判断两个相邻元素是否相等。3 代码int cmp(const void* p1, const void* p2){ return *(int*)p1 - *(int*)p2;}bool containsDuplicate(int* nums, int numsSize){ qsort(nums, numsSize, sizeof(int), cmp); bool ans = false;原创 2021-12-15 00:15:00 · 679 阅读 · 0 评论 -
169. Majority Element(多元素)———附带思路和完整代码
文章目录0 效果1 题目2 思路3 代码0 效果1 题目2 思路个数最多的元素一定在容器的中间位置。3 代码class Solution {public: int majorityElement(vector<int>& nums) { std::sort(nums.begin(), nums.end()); return nums[nums.size()/2]; }};int cmp(const void* p1,原创 2021-12-14 23:00:00 · 930 阅读 · 0 评论 -
912. Sort an Array(排序数组)———附带思路和完整代码
文章目录0 效果1 题目2 思路3 代码0 效果1 题目2 思路排序的API调用3 代码C++:class Solution {public: vector<int> sortArray(vector<int>& nums) { auto cmp = [](int a, int b)->bool { return a < b; }; std::sort(nums.b原创 2021-12-14 17:28:11 · 975 阅读 · 0 评论 -
1389. 按既定顺序创建目标数组
文章目录0 效果1 题目2 思路3 代码0 效果1 题目2 思路向量插入操作或数组移位操作。3 代码C++:class Solution {public: vector<int> createTargetArray(vector<int>& nums, vector<int>& index) { vector<int>ans; for(int i = 0;i < nums.si原创 2021-12-13 20:43:24 · 126 阅读 · 0 评论 -
剑指 Offer 17. 打印从1到最大的n位数
文章目录0 效果1 题目2 思路3 代码0 效果1 题目2 思路3 代码C:int* printNumbers(int n, int* returnSize){ int num = 1; for(int i = 0;i < n;i++){ num *= 10; } int* p = (int*) malloc(sizeof (int) * num); num--; for(int i = 0;i <= num;i++原创 2021-12-13 20:41:17 · 115 阅读 · 0 评论 -
剑指 Offer 05. 替换空格
文章目录0 效果1 题目2 思路3 代码0 效果1 题目2 思路char数组操作3 代码char * replaceSpace(char * address){ char* p =(char*) malloc(sizeof(int) * 1000); int index = 0; for(int i = 0;i < strlen(address); i++){ if(*(address + i) == ' '){ *(p原创 2021-12-13 20:35:53 · 110 阅读 · 0 评论 -
509. Fibonacci Number(斐波那契数列)————附带详细解析和代码
文章目录0 效果1 题目2 思路2.1 动态规划(打表)2.2 矩阵快速幂2.3 通项公式3 代码3.1 打表3.2 矩阵快速乘3.3 通项公式0 效果1 题目2 思路2.1 动态规划(打表)递归写法为:int F(int n){ if(n == 0 || n == 1) return 1; else return F(n-1) + F(n-2);}递归会涉及到很多重复的计算,如当n==5时,可以得到F(5)= F(4)+F(3),接下来计算F(4)时又会有F(4)=原创 2021-12-12 16:37:10 · 509 阅读 · 0 评论 -
1108. IP 地址无效化
文章目录0 效果1 题目2 思路3 代码0 效果1 题目2 思路考察string和char数组的操作。3 代码C++:class Solution {public: string defangIPaddr(string address) { auto replace_all= [](string& str, const string& old_s, const string& new_s){ for(string ::原创 2021-12-13 20:32:06 · 1517 阅读 · 0 评论 -
剑指 Offer 58 - II. 左旋转字符串
文章目录0 效果1 题目2 思路3 代码0 效果1 题目2 思路考察指针和string操作,有些小细节容易出错。注意:1,char数组最后一个字符需要是\0;2,string字符串按位赋值为初始化时,不能使用 s2[i]=s1[i] 进行赋值;要使用这样的语句:s2=s2+s1[i]。3 代码法1:char* reverseLeftWords(char* s, int n){ int length = 0; for(;*(s + length) != '\0';le原创 2021-12-13 20:29:53 · 372 阅读 · 0 评论 -
1480. Running Sum of 1d Array(一堆数组的动态和)
文章目录0 效果1 题目2 思路3 代码0 效果1 题目2 思路简单的数组指针操作3 代码int* runningSum(int* nums, int numsSize, int* returnSize){ int* p = (int*) malloc(sizeof (int) * numsSize); int temp = 0; for(int i = 0;i < numsSize;i++){ temp += *(nums + i);原创 2021-12-13 20:26:14 · 231 阅读 · 0 评论 -
1920. Build Array from Permutation(基于排列构建数组)
文章目录0 效果1 题目2 思路3 代码0 效果1 题目2 思路简单的数组指针操作3 代码int* buildArray(int* nums, int numsSize, int* returnSize){ int *p = (int*) malloc(sizeof(int) * numsSize); for(int i = 0;i < numsSize;i++){ *(p+i) = *(nums + (*(nums + i))); }原创 2021-12-13 20:22:56 · 269 阅读 · 0 评论 -
1929. Concatenation of Array(数组串联)
文章目录0 效果1 题目2 思路3 代码0 效果1 题目2 思路简单的数组操作。3 代码int* getConcatenation(int* nums, int numsSize, int* returnSize){ int* p = (int*) malloc(sizeof(int) * 2* numsSize ); for(int i = 0;i < numsSize;i++){ *(p + i) = *(nums + i); *(p原创 2021-12-13 20:20:33 · 260 阅读 · 0 评论 -
1470. Shuffle the Array(数据重排列)
文章目录0 效果1 题目2 思路3 代码0 效果1 题目2 思路简单的数组或向量操作。3 代码C++:class Solution {public: vector<int> shuffle(vector<int>& nums, int n) { vector<int> c; for (int i = 0; i < n; ++i) { c.push_back(nums[i]);原创 2021-12-13 20:16:04 · 183 阅读 · 0 评论 -
LCP 06. 拿硬币———附带思路和完整代码
文章目录0 效果1 题目2 思路3 代码0 效果1 题目2 思路如果硬币数n是偶数,拿硬币次数位n/2;n是偶数,拿硬币次数位n/2 + n%2。3 代码class Solution {public: int minCount(vector<int>& coins) { int ans = 0; for(auto i:coins){ ans += i/2 + i%2; } r原创 2024-03-04 18:00:00 · 748 阅读 · 0 评论 -
LCP 01. 猜数字———附带思路和完整代码
文章目录0 效果1 题目2 思路3 代码0 效果1 题目2 思路暴力枚举。3 代码class Solution {public: int game(vector<int>& guess, vector<int>& answer) { int ans = 0; for(int i = 0;i < 3;i++){ ans += guess[i] == answer[i] ? 1 : 0原创 2024-03-01 08:02:30 · 425 阅读 · 1 评论 -
33. Search in Rotated Sorted Array(搜索旋转排序数组, II,最小值)————附带详细思路
文章目录0 效果1 题目2 思路3 代码0 效果1 题目2 思路使用二分法进行查询,判断mid前后的部分哪部分有序且target在这个有序序列范围内,就去那段查找,否则去另一段查找。以下思路摘自官网3 代码class Solution {public: int search(vector<int>& nums, int target) { int n = (int)nums.size(); if(n == 0) return原创 2021-12-12 18:52:45 · 176 阅读 · 0 评论 -
1137. N-th Tribonacci Number(泰波那契数列)————附带详细解析和代码
文章目录0 结果1 题目2 解析2.1 动态规划2.2 矩阵快速幂3 代码3.1 动态规划3.2 矩阵快速幂0 结果1 题目2 解析2.1 动态规划普通的递归会涉及到很多重复的计算,如当n==5时,可以得到F(5)= F(4)+F(3)+F(2),接下来计算F(4)时又会有F(4)= F(3)+F(2)+F(1),这时不采取措施,F(3)将会被计算两次。如果n很大,重复计算的次数将难以想象。实际上由于没有保存中间计算的结果,实际复杂度将会高达O(2n),即每次都会计算F(n-1)、F(n-2原创 2021-12-12 16:19:08 · 265 阅读 · 0 评论 -
50. Pow(x, n)————附带详细解析和代码
文章目录1 题目2 思路2.1 快速乘(递归)2.2 非递归版本3 代码3.13.2 非递归版本1 题目2 思路2.1 快速乘(递归)以下内容摘自官网2.2 非递归版本以下讲解摘自官网由于官方的讲解有些地方不够详细,这里我补充讲一下自己的思路。首先看一下快速乘的思路:A*B=(A<<1)*(B>>1)【B为偶数】=(A<<1)*(B>>1) + A【B为奇数】例子:6 * 7 = 6 * 6 + 6= (6 * 2)*原创 2021-12-12 13:46:33 · 452 阅读 · 0 评论 -
69. Sqrt(x)/367. Valid Perfect Square( 有效的完全平方数)————附带详细思路和代码
文章目录01 题目2 思路2.1 二分法无限逼近2.2 使用对数的性质2.3 牛顿迭代法3 代码3.1 二分3.2 对数性质3.3 牛顿迭代法01 题目2 思路有效的完全平方数和求根号的思路一致,都是先求出x的根号值,然后判断x的根号值乘以x的根号值是否等于x即可。下面只讲求x的根号值。2.1 二分法无限逼近2.2 使用对数的性质以下解析摘自官网2.3 牛顿迭代法通俗来说就是随机再函数上取一个点,然后做这点的切线,得到切线与x轴的交点,然后这个新的交点作为新切点的x坐标,这样重复迭代原创 2021-12-12 11:05:30 · 209 阅读 · 0 评论 -
1492. The kth Factor of n (n的第k个因子)————附带详细代码和思路
文章目录0 效果1 题目2 思路3 代码0 效果1 题目2 思路暴力枚举所有情况,然后判断是否是第k个返回,如果枚举完了,还没有返回,那就是返回false。3 代码class Solution {public: int kthFactor(int n, int k) { int index = 1; for(int i = 1;i <= n;i++){ if(n % i == 0){ if原创 2021-12-12 10:18:37 · 183 阅读 · 0 评论 -
2、3、4的幂(对应leetcode的231、326、342题)————附解析和详细代码
文章目录0 效果1题目3 代码3.1 2 的幂3.2 3 的幂3.3 4的幂0 效果1题目231. 2 的幂 给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。 示例 1:输入:n = 1输出:true解释:20 = 1示例 2:输入:n = 16输出:true解释:24 = 16示例 3:输入:n = 3输出:false原创 2021-12-12 00:29:32 · 260 阅读 · 0 评论 -
29. Divide Two Integers(两数相除)————附带详细代码和思路
文章目录0 结果![请添加图片描述](https://img-blog.csdnimg.cn/0de24c78ce004b2bbb36a90700294115.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA57mB5pif6JOd6Zuo,size_20,color_FFFFFF,t_70,g_se,x_16)1 题目2 思路2.1 思路12.2 思路23 代码3.1 思路13.2 思路二0 结果原创 2021-12-11 22:36:51 · 551 阅读 · 0 评论 -
面试题 08.05. Recursive Mulitply LCCI(递归乘法)————附带详细代码和解析
文章目录0 结果1 题目2 思路3 代码0 结果1 题目2 思路计算A*B,方法为:对乘数进行拆分,如果是B是偶数(与1做&运算法,结果是0),就让A左移一位(乘2),然后B右移一位(除2);若果B是奇数(与1做&运算法,结果非0),就让结果集加上一个A(等价于让B-1),然后继续进行拆分,直至B为0为止。上述的文字描述等价于:A*B=(A<<1)*(B>>1)【B为偶数】=(A<<1)*(B>>1) + A【B为奇数】例原创 2021-12-11 10:24:34 · 407 阅读 · 0 评论 -
371. Sum of Two Integers(两数之和)——————附带详细解析和代码
文章目录0 效果1 题目2 思路3 代码0 效果1 题目2 思路使用补码进行位运算(因为补码表示法中的加法和减法可以统一使用加法操作实现)。补充知识:1,正数的补码和原码相同,负数的补码等于对原码种的数值部分按位取反后末位加1。2,有符号的移位都是算术移位。3,算术移位对于正数的补码是补0,对于负数是左移添0,右移添1。4,补码:最高位为符号位,0表示正数,1表示负数。5,减法用加法实现:[x-y]补=[x]补-[y]补=[x]补+[-y]补6,补码运算中,符号位参与运算,符号位原创 2021-12-10 23:32:00 · 482 阅读 · 0 评论 -
172 Factorial Trailing Zeroes(阶乘后的零)————附带详细思路和代码
文章目录0 效果1 题目2 思路3 代码0 效果1 题目Given an integer n, return the number of trailing zeroes in n!.Note that n! = n * (n - 1) * (n - 2) * … * 3 * 2 * 1.Example 1:Input: n = 3Output: 0Explanation: 3! = 6, no trailing zero.Example 2:Input: n = 5Output:原创 2021-12-09 21:30:00 · 190 阅读 · 0 评论