
leetcode
三Ⅶ
这个作者很懒,什么都没留下…
展开
-
leetcode 24
方法一 迭代class Solution {public: ListNode* swapPairs(ListNode* head) { if(!head||!head->next) { return head; } ListNode*pre=new ListNode(0,head); ListNode*a=pre; while(a->next&.原创 2021-11-21 13:15:01 · 83 阅读 · 0 评论 -
leetcode 739每日温度
class Solution {public: vector<int> dailyTemperatures(vector<int>& temperatures) { int n=temperatures.size(); vector<int> ans(n,0); stack<int> d; for(int i=0;i<n-1;i++) { .原创 2021-08-12 16:21:27 · 79 阅读 · 0 评论 -
leetcode 28
解法一(暴力匹配)class Solution {public: int strStr(string haystack, string needle) { int n=haystack.size(); int m=needle.size(); if(m==0) { return 0; } if(n==0) { return -1; }.原创 2021-08-12 15:17:56 · 81 阅读 · 0 评论 -
排序算法(复杂度nlogn)
1:希尔排序class Solution {public: vector<int> sortArray(vector<int>& a) { int increment=a.size(); int n=a.size(); do { increment=increment/3+1;//设置一个间隔值 for(int i=increment;i<n;i++) { in原创 2021-06-11 21:03:45 · 362 阅读 · 0 评论 -
498. 对角线遍历
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。其实这道题挺绕的,我当时做也一下子没搞清楚,设置了一大堆边界条件把自己设死了,后面看了题解发现可以每次都按照一个方向遍历对角线,只是偶数次遍历时将说得元素翻转。图例:class Solution {public: vector<int> findDiagonalOrder(vector<vector<int>>& matr原创 2021-06-05 14:13:20 · 162 阅读 · 0 评论 -
203. 移除链表元素
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。两种思路:第一种迭代:依次遍历每个元素class Solution {public: ListNode* removeElements(ListNode* head, int val) { while(head!=NULL&&head->val==val) { ListNo原创 2021-06-05 10:45:47 · 82 阅读 · 0 评论 -
leetcode 56合并区间
具体思路:按照二维数组中的首元素队该数组进行排序,设定一个新数组m,若m为空或者两个区间不交叉(第一个区间的右边界是否小于第二个区间的左边界),那么添加新的边界,如果交叉,则直接修改右边界class Solution {public: vector<vector<int>> merge(vector<vector<int>>& intervals) { if (intervals.size()==0) {.原创 2021-06-03 16:12:29 · 107 阅读 · 0 评论 -
leetcode 每日一题6-3
连续数组这道题和6-2的每日一题思路(6-2每日一题)比较相似,都是利用前缀和+哈希表进行求解我们设在nums[i]前每有一个1,那么前缀+1,每有一个零,那么前缀-1,那么如果在nums[i]-nums[j]之间0 1数量相等,则前缀也一定相等举个例子由图我们可以看出,有两组前缀和相等,之后在利用下标求出长度即可。特殊情况:在这种情况下,0只出现了一次,但是我们必须考虑这种情况所以在最开始预设一个mp[0]=-1计算长度为3-()-1=4class Solution {publi.原创 2021-06-03 15:42:53 · 78 阅读 · 0 评论 -
724. 寻找数组的中心下标
解题思路:设中心下标为c,若该元素前面元素之和等于该元素后面元素之和,则有2*(num1+num2+…num(c-1))+numc=该数组所有元素之和。class Solution {public: int pivotIndex(vector<int>& nums) { int s=accumulate(nums.begin(),nums.end(),0); int sum=0; for(int i=0;i<nums.s.原创 2021-06-02 20:28:22 · 68 阅读 · 0 评论 -
leetcode160. 相交链表
编写一个程序,找到两个单链表相交的起始节点。解题思路:双指针把,并把两链表头尾进行相连,同时移动,相遇节点则为相交节点。图解:红色代表a节点,黄色代表c节点此时a=b跳出循环,返回aclass Solution {public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { if(headA==NULL||headB==NULL) {原创 2021-06-02 20:20:19 · 154 阅读 · 0 评论 -
leetcode 每日一题06-02(523)
连续的子数组和给你一个整数数组 nums 和一个整数 k ,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组:子数组大小 至少为 2 ,且子数组元素总和为 k 的倍数。如果存在,返回 true ;否则,返回 false 。如果存在一个整数 n ,令整数 x 符合 x = n * k ,则称 x 是 k 的一个倍数。解题思路 :哈希表+前缀和设前n个数字之和为Sn,那么一个子数组(l,r)所有元素之和为Sr-Sl;且若和为k的倍数,则有(Sr-Sl)%k=0;展开可得Sr%k.原创 2021-06-02 19:24:32 · 203 阅读 · 0 评论 -
141. 环形链表
给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。解题思路:双指针(快慢指针),设定一个快指针,一个慢指针,如果链表中存在环的话,那么两个指针一定会相遇(类似于追击原创 2021-06-01 13:55:27 · 157 阅读 · 1 评论 -
leetcode206反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表示例一:输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]示例二:输入:head = [1,2]输出:[2,1]思路一:迭代(对每个点依次进行处理)简图便于理解class Solution {public: ListNode* reverseList(ListNode* head) { ListNode* prev = nullptr; ListNode* cur原创 2021-06-01 13:29:42 · 101 阅读 · 0 评论 -
排序算法 leetcode 912(时间复杂度为n^2)
给你一个整数数组 nums,请你将该数组升序排列。方法一:c++ sortclass Solution {public: vector<int> sortArray(vector<int>& nums) { sort(nums.begin(),nums.end()); return nums; }};方法二:冒泡二重循环,遇到数字小的进行交换class Solution {public: vecto原创 2021-05-31 15:16:16 · 291 阅读 · 0 评论 -
leetcode 每日一题5-28
477. 汉明距离总和两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量。计算一个数组中,任意两个数之间汉明距离的总和输入: 4, 14, 2输出: 6解释: 在二进制表示中,4表示为0100,14表示为1110,2表示为0010。(这样表示是为了体现后四位之间关系)所以答案为:HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6.题解思路:由于汉明距离是是原创 2021-05-28 10:23:38 · 558 阅读 · 0 评论 -
leetcode每日一题
子数组异或查询有一个正整数数组 arr,现给你一个对应的查询数组 queries,其中 queries[i] = [Li, Ri]。对于每个查询 i,请你计算从 Li 到 Ri 的 XOR 值(即 arr[Li] xor arr[Li+1] xor … xor arr[Ri])作为本次查询的结果。并返回一个包含给定查询 queries 所有结果的数组示例 1:输入:arr = [1,3,4,8], queries = [[0,1],[1,2],[0,3],[3,3]]输出:[2,7,14,8.原创 2021-05-12 14:14:48 · 161 阅读 · 0 评论 -
leetcode 每日一题5.9
给你一个整数数组 bloomDay,以及两个整数 m 和 k 。现需要制作 m 束花。制作花束时,需要使用花园中 相邻的 k 朵花 。花园中有 n 朵花,第 i 朵花会在 bloomDay[i] 时盛开,恰好 可以用于 一束 花中。请你返回从花园中摘 m 束花需要等待的最少的天数。如果不能摘到 m 束花则返回 -1 。方法:二分法判断天数class Solution {public: int minDays(vector<int>& bloomDay, int m,原创 2021-05-09 23:54:41 · 115 阅读 · 0 评论 -
leetcode240. 搜索二维矩阵 II
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。方法一:暴力循环两个for循环(超出时间限制)class Solution {public: bool searchMatrix(vector<vector<int>>& matrix, int target) { int n=matrix.size(); i原创 2021-05-07 11:13:52 · 83 阅读 · 0 评论 -
leetcode 1026
深度优先搜索,在深度优先搜索的前提下将根所得最大值以及最小值传递下去,然后求取resclass Solution {public: int maxAncestorDiff(TreeNode* root) { dfs(root,root->val,root->val); return res; } int res=0; private: void dfs(TreeNode*node,int ma,int mi) .原创 2021-05-06 15:48:26 · 97 阅读 · 0 评论 -
leetcode 每日一题5.6
题目描述:未知 整数数组 arr 由 n 个非负整数组成。经编码后变为长度为 n - 1 的另一个整数数组 encoded ,其中 encoded[i] = arr[i] XOR arr[i + 1] 。例如,arr = [1,0,2,1] 经编码后得到 encoded = [1,2,3] 。给你编码后的数组 encoded 和原数组 arr 的第一个元素 first(arr[0])。请解码返回原数组 arr 。可以证明答案存在并且是唯一的。关键思路:if x XOR y = zthen x原创 2021-05-06 13:47:30 · 153 阅读 · 0 评论 -
leetcode 每日一题5.5
题目:给你一个整数数组 nums ,你可以对它进行一些操作。每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除每个等于 nums[i] - 1 或 nums[i] + 1 的元素。开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。方法:step1:利用*max_element求取vector中的最大值step2:定义数组一s,大小为 max+1,用于存储每个数字出现个数。数组二dp,用于存放结果。step3:设置状态转移方程dp[k]原创 2021-05-05 22:50:11 · 205 阅读 · 0 评论 -
剑指offer15
请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。方法:位运算class Solution {public: int hammingWeight(uint32_t n) { int count=0; while(n!=0){ count++; n=n&(n-1);原创 2021-05-04 20:03:09 · 79 阅读 · 0 评论 -
剑指offer 13
题目地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?示例 1:输入:m = 2, n = 3, k = 1输出:3示例 2:输入:m = 3原创 2021-05-04 16:35:03 · 88 阅读 · 0 评论 -
剑指offer 07
07 重建二叉树通过前序和中序遍历重建二叉树方法一:迭代利用一个栈辅助重建栈中第一个元素为根节点(前序遍历第一个元素)指定一个指针i(0,中序遍历)遍历前序遍历,入栈,当p【j】!=i【i】时,将其作为左子树当遇到相等元素时,栈顶元素出栈,并建立右子树。class Solution {public: TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {原创 2021-05-04 15:31:21 · 81 阅读 · 0 评论