![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
刷题笔记
文章平均质量分 86
leetcode刷题笔记
乔桃李
这个作者很懒,什么都没留下…
展开
-
字符串相加
415字符串相加class Solution {public: string addStrings(string num1, string num2) { string Result = ""; if (num2.empty()) return num1; if (num1.empty()) return num2; int i1 = num1.size() - 1, i2 = num2.size() - 1; int Tem = 0, Nex = 0; while (i1 &原创 2020-07-16 21:36:09 · 199 阅读 · 0 评论 -
两数相加
两数相加class Solution {public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {//第一步 建立要返回的链表头pPre,并用pNode在之后循环新建链表 ListNode *pPre = new ListNode(NULL); ListNode *pNode = pPre; int carry = 0, sum = 0;//第二步 每次遍历两个链表有三个原创 2020-07-19 10:00:29 · 61 阅读 · 0 评论 -
剑指offer_53 数字在排序数组中出现的次数
数字在排序数组中出现的次数统计一个数字在排序数组中出现的次数。//简单方法 数组中都是整形,可以通过搜索-0.3和+0.3查找出现的头和尾class Solution {public: int GetNumberOfK(vector<int> data ,int k) { return findIndex(data, k + 0.3) - findIndex(data, k - 0.3);//用小数与数组中数字比较 }private:原创 2020-07-16 21:54:48 · 72 阅读 · 0 评论 -
二维数组查找
二维数组的查找查找一个数是否在二维数组中class Solution {public: bool Find(int target, vector<vector<int> > array) { if (array.empty()) return false; int raw = 0, column = array[0].size() - 1; while (raw < array.size() &&.原创 2020-07-16 22:00:18 · 80 阅读 · 0 评论 -
两数之和
1两数之和:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。c++的map是红黑树,查找时间是logN。unordered_map底层是hash表,理论时间O(1)把数组元素值作为key,下标作为value存入哈希表,如果这次遍历的target-nums[i]在哈希表中,就把哈希表中的下标和本次遍历的下标存入结果数组中。class Solution {public: vector<int> twoSum(原创 2020-07-16 21:33:54 · 74 阅读 · 0 评论 -
循环队列
循环队列class MyCircularQueue {public: /** Initialize your data structure here. Set the size of the queue to be k. */ MyCircularQueue(int k) { front = 0;//front永远指向第一个 rear = 0;//rear指向队尾的下一个 length = k + 1;//留一位用于判断队列是否满了原创 2020-07-16 21:37:02 · 52 阅读 · 0 评论 -
和系列_leetcode 三数之和
三数之和class Solution {public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int> > Result; if (nums.size() < 3) return Result; sort(nums.begin(), nums.end()); for (i原创 2020-07-19 06:21:58 · 97 阅读 · 0 评论 -
数组中只出现一次的数字
数组中只出现一次的数字(*)<注:按位与&:都为1的时候才为1><注:按位或|:有1的时候才为1><注:按位异或^:相同为0,相异为1,0异或任何数A都是A><注:按位取反~>class Solution {public: void FindNumsAppearOnce(vector<int> data, int* num1, int* num2) { int size = data.size(); if (siz.原创 2020-07-16 21:57:22 · 69 阅读 · 0 评论 -
构建乘积数组
构建乘积数组给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)B中每个元素为A去掉B下标的元素相乘。class Solution {public: vector<int> multiply(const vect原创 2020-07-16 22:03:36 · 83 阅读 · 1 评论 -
剑指offer03 查找数组中的重复数字
2 . 数组中重复的数字(查找数组中第一个重复的数字)(*)简单来说就是先把数字按下标填上,遇到相同的就找到了class Solution {public: bool duplicate(int numbers[], int length, int* duplication) { if (length < 1) return false;//第一步 遍历这个数组 for (int i = 0; i < length; i++) {//第二步 用原创 2020-07-16 22:01:53 · 88 阅读 · 0 评论 -
二分法的递归与循环
二分法的递归与循环,核心就是通过不断缩减左右指针缩小查找数的范围//递归代码class Solution {public: int FindFir(vector<int> data, int head, int end, int k) { //递归中的这个条件可作为循环的条件(相反) if (head > end) return 0;//如果head跑到end后面或者end跑到head前面,注!!是比较的下标 int mid = (head + end) / 2;//这原创 2020-07-16 21:52:22 · 250 阅读 · 0 评论 -
连续子数组的最大和
连续子数组的最大和(*)将数组第一位存入curSum与maxSum,从下一位开始遍历,判断之前的curSum值不值当加class Solution {public: int FindGreatestSumOfSubArray(vector<int> array) { if (array.size() == 0) return 0; int curSum = array[0], maxSum = array[0]; for (int i原创 2020-07-16 21:58:35 · 81 阅读 · 0 评论 -
leetcode56 合并区间
合并区间class Solution {public: vector<vector<int>> merge(vector<vector<int>>& intervals) { vector<vector<int> > Result; if (intervals.empty()) return Result; sort(intervals.begin(), interv原创 2020-07-18 23:36:27 · 58 阅读 · 0 评论 -
合并k个排序链表
把数组二分直到两两合并class Solution {public: ListNode* mergeKLists(vector<ListNode*>& lists) { if (lists.size() < 1) return NULL; return mergeLists(lists, 0, lists.size() - 1); }private: ListNode *mergeLists(vector<Lis原创 2020-07-19 11:43:14 · 76 阅读 · 0 评论 -
662. 二叉树最大宽度
662二叉树最大宽度用一个队列层次遍历(用每层的长度作为for循环,队列是空的作为while循环),将二叉树每个节点编号。class Solution {public: int widthOfBinaryTree(TreeNode* root) { if (!root) return 0; queue<pair<TreeNode *, unsigned long long int>> que; que.push({roo原创 2020-07-16 21:33:08 · 86 阅读 · 0 评论 -
整数翻转
7整数翻转INT_MAX = 2^31-1;INT_MIN = -2^31;class Solution {public: int reverse(int x) { if (x < 0) { if (x < -INT_MAX) return 0;//负数比正数表示数字多一个,因此这里要放置溢出 x = -x; return -reverse_Core(x); }原创 2020-07-16 21:35:16 · 62 阅读 · 0 评论 -
236. 二叉树的最近公共祖先
二叉树的最近公共祖先给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。所有节点的值都是唯一的。p、q 为不同节点且均存在于给定的二叉树中。class Solution {public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { TreeNode *pNode = root; if (!pNode || pNode == p || pNode ==原创 2020-07-17 14:34:40 · 56 阅读 · 0 评论 -
socket编程实战
链表中环的入口节点(注意:法一是网上提供的在确定链表中有环时,直接将pFast = pHead,然后平移(网上证明是pFast和pSlow之间间隔是环的节点数)。//考虑三种情况:(1)链表是空的;(2)链表只有一个<这两种情况都不可能有环返回null>;(3)链表没有环在下面一步循环结束考虑return NULL;//两个指针指向头,然后pFast移两步,pSlow移一步,如果相等就能知道有无环。<pFast->next是空的时候说明无环返回NULL>;//继续在原创 2020-07-17 13:53:24 · 106 阅读 · 0 评论 -
数组中出现超过一半的数字
数组中出现次数超过一半的数字(*)采用阵地攻守的思想:第一个数字作为第一个士兵,守阵地;count = 1;遇到相同元素,count++;第一步:遇到不相同元素,即为敌人: (1)当遇到之前相同的士兵被打下来了(count为0),本次遍历的士兵站上去。(2)上面有士兵,就削弱他一次。第二步:验证一下,因为如果例如{1,2,3}到3的时候前面两个士兵互相抵消的,而3不是出现超过一半。class Solution {public: int MoreThanHalfNum_Solution原创 2020-07-16 22:04:53 · 78 阅读 · 0 评论 -
跳跃游戏
class Solution {public: bool canJump(vector<int>& nums) { int k = 0;//用k记录之前节点能跳到的最远位置 for (int i = 0; i < nums.size(); i++) { if (i > k) return false;//如果遍历到的这个节点之前的所有节点都跳不到就说明跳不到最右边 k = max(k,.原创 2020-07-22 21:35:29 · 58 阅读 · 0 评论 -
leetcode69__x的平方根
class Solution {public: int mySqrt(int x) { long long int left = 0, right = x; while (left <= right) {//注!!等于时候需要判断最后找到这个符不符合条件 long long int middle = (left + right) >> 1; if ((middle * middle) < x).原创 2020-07-29 17:43:59 · 111 阅读 · 0 评论 -
用数组创建链表模板
struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {}};int main() { ListNode *pHead = new ListNode(NULL); ListNode *pPre = pHead, *pNode = NULL; vector<int> vec = { 1,2,3,3,4,4,5 }; for (int i = 0; i < vec.siz原创 2020-08-03 16:19:02 · 422 阅读 · 0 评论 -
(已处理)二叉树中和为某一路径的和
直径的意思是一直到树的叶节点class Solution {public: vector<vector<int>> pathSum(TreeNode* root, int sum) { dfsPath(root, sum); return Result; }private: vector<vector<int> > Result; vector<int> tem; Tre原创 2020-07-24 22:00:20 · 112 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表
/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) :* val(x), next(NULL) {* }* };*/class Solution{public: vector<int> printListFromTailToHead(ListNode* head) { vector<i原创 2020-08-03 14:54:39 · 81 阅读 · 0 评论 -
543. 二叉树的直径
class Solution {public: int diameterOfBinaryTree(TreeNode* root) { dfsCore(root); return res; }private: int res = 0; int dfsCore(TreeNode *root) { if (!root) return 0; int left = dfsCore(root->left); .原创 2020-07-21 16:40:28 · 65 阅读 · 0 评论 -
反转链表
class Solution {public: ListNode* reverseList(ListNode* head) { if(!head) return NULL; ListNode *pPre = NULL, *pNode = head, *pNext = head->next; while (pNode) { pNode->next = pPre; if (!pNext) bre原创 2020-08-03 15:21:29 · 51 阅读 · 0 评论 -
83. 删除排序链表中的重复元素(重复保存一个)
class Solution {public: ListNode* deleteDuplicates(ListNode* head) { if(!head) return NULL; ListNode *phead = new ListNode(-1); phead->next = head; ListNode *pPre = phead, *pNode = head, *pNext = head->next; while原创 2020-08-03 16:21:24 · 75 阅读 · 0 评论 -
剑指offer53 0 ~ n-1中缺失的数
意思是n-1长度的数组,n个数字缺失一个依次放入二分法查找缺失数字的交界处,注意有可能是0就缺失了class Solution {public: int missingNumber(vector<int>& nums) { int left = 0, right = nums.size() - 1; while (left <= right) { int middle = (left + right) >.原创 2020-07-21 15:32:09 · 93 阅读 · 0 评论 -
leetcode 744寻找比目标字母大的最小字母
class Solution {public: char nextGreatestLetter(vector<char>& letters, char target) { int left = 0, right = letters.size() - 1; while (left < right) { int middle = (left + right) >> 1; if (le.原创 2020-07-29 20:24:08 · 122 阅读 · 0 评论 -
岛屿的最大面积
岛屿的最大面积双层循环遍历矩阵,找到是1的元素就输入dfs函数,输出遍历最大的数字class Solution {public: int maxAreaOfIsland(vector<vector<int>>& grid) { if (grid.empty()) return 0; int resSum = 0, curSum = 0; for(int i = 0; i < grid.size(); i++原创 2020-07-20 19:39:42 · 101 阅读 · 0 评论 -
leetcode209 长度最小的子数组
定义两个指针 i 、一个记录长度length、和一个记录累加值tem。用j遍历这个数组并累加遍历到的数字。当发现累加值大于给的数字s时候,把这个长度存入length,再把i上的数字减掉,i右移。class Solution {public: int minSubArrayLen(int s, vector<int>& nums) { int length = INT_MAX, i = 0, tem = 0; for (int j = 0;.原创 2020-07-24 19:24:15 · 71 阅读 · 0 评论 -
剑指 Offer 07. 重建二叉树重建二叉树
题目:根据二叉树的中序于前序遍历结果重建二叉树。解:用preorder[0]在inorder中找到根的位置,才能把preorder和inorder划分成左右子树。class Solution {public: TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { if (preorder.empty()) return NULL; TreeN原创 2020-08-03 17:25:51 · 75 阅读 · 0 评论 -
和系列_字节面试题 查找两个数组的最大小于M的下标
字节跳动面试题指针left指向一个数组a头,指针right指向数组b尾,比M大则移动right,比M小则移动left,途中不断更新最大的小于M的值和下标。class Solution {public: vector<int> twoMaxsum(vector<int> nums1, vector<int> nums2, int M) { vector<int> Result; int left = 0, right = nums2.size(原创 2020-07-29 17:50:49 · 96 阅读 · 0 评论 -
岛屿数量
与岛屿面积大小差不多class Solution {public: int numIslands(vector<vector<char>>& grid) { int count = 0; for (int i = 0; i < grid.size(); i++) { for (int j = 0; j < grid[i].size(); j++) { if (gr.原创 2020-07-21 16:05:02 · 49 阅读 · 0 评论 -
链表中倒数第k个节点
class Solution {public: ListNode* getKthFromEnd(ListNode* head, int k) { if (!head) return NULL; ListNode *pFir = head, *pSec = head; int i = 0; for( ; i < k; i++) { if (!pSec) break; pSec = p原创 2020-08-03 15:12:51 · 49 阅读 · 0 评论 -
二叉树的下一个节点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。解:中序遍历是左根右,分类(1)pNode是否有右节点<如b>,有右节点就一直找到右节点的最左节点。<右节点没有左节点返回自身>(2)pNode没有右节点<如d、i>,就一直上溯直到pNode是pFar的左节点。/*struct TreeLinkNode { int val; struct TreeLin原创 2020-08-03 16:59:44 · 85 阅读 · 0 评论 -
leetcode540有序数组中的单一元素
判断middle是前一个和它一样,还是后一个和他一样,然后越过和它相同的数字,判断左右的奇偶,如果和前一个后一个都不同就输出class Solution {public: int singleNonDuplicate(vector<int>& nums) { int left = 0, right = nums.size() - 1; while (left < right) { int middle = (lef原创 2020-07-29 21:16:26 · 296 阅读 · 1 评论 -
142. 环形链表 II链表环的入口
链表中环的入口节点(注意:法一是网上提供的在确定链表中有环时,直接将pFast = pHead,然后平移(网上证明是pFast和pSlow之间间隔是环的节点数)。//考虑三种情况:(1)链表是空的;(2)链表只有一个<这两种情况都不可能有环返回null>;(3)链表没有环在下面一步循环结束考虑return NULL;//两个指针指向头,然后pFast移两步,pSlow移一步,如果相等就能知道有无环。<pFast->next是空的时候说明无环返回NULL>;//继续在原创 2020-08-19 20:28:32 · 157 阅读 · 0 评论 -
二叉树中的列表
给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表。查找树中有没有一条路径和链表相同class Solution {public: bool isSubPath(ListNode* head, TreeNode* root) { if (!root) return false; if (root->val == head->val) { if (isSub(head, root)) {原创 2020-08-15 12:31:51 · 139 阅读 · 0 评论 -
不同的路径 和 不同的路径||
题目:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?解:先看终点, 机器人只能从上方或者右方进入终点,所以得到状态方程:dp[i][j] = dp[i - 1][j] + dp[i][ j- 1]。dp数组就是每个方块内机器人到达的所有路径和。需要从开始点计算,所以边界值就是dp数组的第一行和第原创 2020-08-20 10:35:22 · 201 阅读 · 0 评论