leecode
用来记录自己刷的力扣题目,从简单到复杂,坚持加油!
甜橙の学习笔记
勿在浮沙筑高台
展开
-
力扣哈希表之 242.有效的字母异位词
242.有效的字母异位词carl原文:有效的字母异位词 242.有效的字母异位词//方法一:排序比较class Solution {public: bool isAnagram(string s, string t) { sort(s.begin(),s.end()); sort(t.begin(),t.end()); return s == t; }};//方法二:构建哈希表比较class Solution {publi原创 2021-08-18 10:52:15 · 106 阅读 · 0 评论 -
力扣链表之 160. 相交链表
160. 相交链表carl原文:相交链表方法二为carl方法。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ //方法一:循环完我就去找你,直到我们相遇class Solution {public: ListNode *g原创 2021-08-18 09:43:05 · 120 阅读 · 0 评论 -
力扣链表之 19.删除链表的倒数第N个节点
19.删除链表的倒数第N个节点carl原文:19.删除链表的倒数第N个节点19.删除链表的倒数第N个节点/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} *原创 2021-08-17 21:24:22 · 131 阅读 · 2 评论 -
力扣链表之 24. 两两交换链表中的节点
两两交换链表中的节点carl原文:两两交换链表中的节点/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNo原创 2021-08-17 20:24:31 · 80 阅读 · 0 评论 -
力扣链表之 反转链表
反转链表carl原文:反转链表206.反转链表//双指针法:pre:前一个 cur:当前 next:下一个class Solution {public: ListNode* reverseList(ListNode* head) { ListNode* pre = nullptr; ListNode* cur = head; while(cur){ ListNode* next = cur ->next;原创 2021-08-17 17:03:38 · 153 阅读 · 0 评论 -
力扣链表之 设计链表
设计链表carl整理 :设计链表 703.设计链表class MyLinkedList {public: /** Initialize your data structure here. */ //头节点不存东西,index从0开始 struct ListNode { int val; ListNode* next; ListNode(int val):val(val), next(nullptr){} };原创 2021-08-17 15:33:47 · 115 阅读 · 0 评论 -
力扣链表之移除链表元素
链表:carl整理链表知识点:# 关于链表,你该了解这些!carl整理:移除链表元素203.移除链表元素/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} *原创 2021-08-17 10:29:40 · 160 阅读 · 0 评论 -
力扣数组之 螺旋矩阵
螺旋矩阵carl 原文:螺旋矩阵59. 螺旋矩阵 IIclass Solution {public: vector<vector<int>> generateMatrix(int n) { vector<vector<int>> matrix(n,vector<int>(n,0)); int xpos = 0,ypos = 0; int number = 1; int原创 2021-08-17 09:50:48 · 136 阅读 · 0 评论 -
力扣之数组 长度最小的子数组
长度最小的子数组上一个有序数组已经写了,暴力法就不说了,没意义,carl 长度最小的子数组原文:长度最小的子数组209:长度最小的子数组//双重循环暴力解决class Solution {public: int minSubArrayLen(int target, vector<int>& nums) { int length = INT32_MAX; int sub = 0; int sum; for原创 2021-08-17 09:36:43 · 207 阅读 · 0 评论 -
力扣之数组移除元素
移除元素carl 原文:移除元素27. 移除元素//快慢指针:只要不等于val就接受赋值class Solution {public: int removeElement(vector<int>& nums, int val) { int j = 0; for(int i = 0; i < nums.size(); i++){ if(nums[i] != val){ nu原创 2021-08-15 21:19:19 · 140 阅读 · 0 评论 -
力扣之数组二分法
二分法以后开始跟着carl刷题了,第一篇:数组二分法:第一题:704. 二分查找class Solution {public: int search(vector<int>& nums, int target) { int l = 0, r = nums.size()-1, mid; while(l<=r){ mid = l+(r-l)/2; if (nums[mid] == targ原创 2021-08-13 21:59:03 · 151 阅读 · 0 评论 -
692. 前K个高频单词(c++lambda()完成哈希表的按value排序)
一、题目:给一非空的单词列表,返回前 k 个出现次数最多的单词。返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。二、思路和代码:class Solution {public: vector<string> topKFrequent(vector<string>& words, int k) { unordered_map<string,int>m; for(原创 2021-05-20 08:18:06 · 201 阅读 · 0 评论 -
137. 只出现一次的数字 II
一、题目:137. 只出现一次的数字 II给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。示例 1:输入:nums = [2,2,3,2]输出:3二、代码和思路:详情参考:剑指 Offer 03. 四种办法解决数组中重复的数字这个小问题-这下应该是全网最全了吧很像,甚至可以直接拿来改一下用了:class Solution {public: int singleNumber(vector<int>原创 2021-04-30 08:37:42 · 99 阅读 · 0 评论 -
633. 平方数之和
一、题目:633. 平方数之和二、代码和思路:方法一:使用sqrt()函数,从0直到这个数的平方大于c,用c值减去i的平方,比较double和int形数值是否一致。class Solution {public: bool judgeSquareSum(int c) { for(long i=0;i*i<=c;i++){ if(sqrt(c-i*i)==int(sqrt(c-i*i))) return true;原创 2021-04-28 11:48:40 · 117 阅读 · 0 评论 -
897. 递增顺序搜索树
一、题目:897. 递增顺序搜索树给你一棵二叉搜索树,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。二、思路、代码和结果:思路:先中序遍历一次二叉树,,然后构建一颗新树,把中序遍历结果依次放到新树的右节点上。class Solution {public: void inorder(TreeNode* root,vector<int>&res){ if(!r原创 2021-04-25 11:26:23 · 172 阅读 · 0 评论 -
剑指 Offer 16. 数值的整数次方+50. Pow(x, n)
一、题目:实现 pow(x, n)即计算 x 的 n 次幂函数(即,xn)。我的思路:通过区分n和0的关系,来进行不同的操作,如果n==0,那么直接返回1;如果大于0,那么建立一个数组用来保存pow(x,i)的值,返回数组的最后一个元素;如果小于0,那么建立一个数组用来保存pow(x,-i)的值,返回数组的最后一个元素的倒数;是不是思路还怪清晰的,结果一顿操作↓↓↓↓↓↓class Solution {public: double myPow(double x, int n)原创 2021-04-24 11:10:26 · 74 阅读 · 0 评论 -
28. C++ 实现 strStr() 也就是优化了大概4次那么多吧(KMP算法next+nextval)
28. 实现 strStr() 函数一、题目:给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。说明:当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。示例 1:输入:haystack原创 2021-04-21 21:30:21 · 575 阅读 · 0 评论 -
如何将力扣的C++代码在自己的编译器上运行?(力扣的输入输出)
如何将力扣的代码在自己的编译器上运行?原创 2021-04-21 16:00:01 · 10362 阅读 · 3 评论 -
反转链表
一、题目:二、解题思路:方法一:循环利用prev将链表指针指依次向其前驱。方法二:递归最后的节点作为开头节点往前倒推:方法三:栈或者数组设置额外的空间,例如栈,利用其先进后出的特性完成翻转;或者将链表元素依次放入数组中逆序输出。三、代码和结果://方法一:循环迭代class Solution {public: ListNode* reverseList(ListNode* head) { ListNode* curr = head;//初始化定义curr原创 2021-03-16 10:03:28 · 86 阅读 · 0 评论 -
翻转二叉树
一、题目:二、解题思路:如果子树不为空将左右节点交换即可。三、代码和结果:class Solution {public: TreeNode* invertTree(TreeNode* root) { if(root ==nullptr)return nullptr; TreeNode *left = invertTree(root->left); TreeNode *right = invertTree(root->right); root原创 2021-03-15 09:51:31 · 68 阅读 · 0 评论 -
找到所有数组中消失的数字
一、题目:给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。找到所有在 [1, n] 范围之间没有出现在数组中的数字。二、解题思路:题中所给数字为1-n,而我们的数组下标刚好是0~n-1,据此,将所给数组中(每个值-1)作为数组下标,并且给数组a[每个值-1]赋值为复数,再遍历一遍数组,将(负的元素+1)入栈,返回。顺便提一下,测试集中有一个空数组。使用if(nums.size()==0) return nums;语原创 2021-03-13 10:51:47 · 164 阅读 · 0 评论 -
汉明距离
一、题目:两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。给出两个整数 x 和 y,计算它们之间的汉明距离。二、解题思路:方法一:将x和y分别用%2转换为二进制的每一位,如果相等就记录下来;方法二:直接返回gcc内集函数__builtin_popcount(x^y)。三、代码和结果://方法二:class Solution { public: int hammingDistance(int x, int y) { int coun原创 2021-03-14 18:07:49 · 144 阅读 · 0 评论 -
合并二叉树
一、题目:给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。二、解题思路:依据题目,两个树合并,也就是各个节点对应相加,如果一个节点为空的话就返回另一棵树的该节点。三、代码和结果:class Solution {public: TreeNode* mergeTrees(TreeNode* roo原创 2021-03-14 18:07:31 · 90 阅读 · 0 评论 -
N 叉树的最大深度
一、题目:给定一个 N 叉树,找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。二、解题思路:和之前的二叉树深度很像,依次的递归遍历树的每个子树的深度,返回最大值+1(根节点)三、代码和结果:class Solution {public: int maxDepth(Node* root) { if(root==0) return 0; int d =0;原创 2021-03-14 15:49:19 · 249 阅读 · 0 评论 -
二叉树的最大深度
一、题目:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。二、解题思路:递归深度遍历二叉树,先左子树再右子树,最后返回左右子树深度的最大值+1(根节点)。三、代码和结果:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right原创 2021-03-14 15:42:22 · 121 阅读 · 0 评论 -
爬楼梯
一、题目:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。二、解题思路:找规律:第0阶台阶, 0种办法第1阶台阶, 1种办法第2阶台阶, 2种办法第3阶台阶, 3种办法第4阶台阶, 5种办法…也就是斐波那契数列,从第三项开始,该项的值为前两项值的和,f[n]=f[n-1]+f[n-2].三代码:class Solution {public: int climbStairs原创 2021-03-14 15:34:46 · 60 阅读 · 0 评论 -
移动零
一、题目:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。二、解题思路:如果包含0元素,将后面的元素进行覆盖,记录下标,然后利用这个下标将下标至数组尾部的元素赋值为0即可。三、代码和结果:class Solution {public: void moveZeroes(vector<int>& nums) { int n = nums.size(); int count = 0;原创 2021-03-13 15:30:31 · 73 阅读 · 0 评论 -
最大子序和
一、题目:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。二、解题思路:动态规划法:核心思想就一句话:如果前一个元素大于0,就把它和当前元素相加。用maxs记录最大值。三、代码和结果:class Solution {public: int maxSubArray(vector<int>& nums) { int n = nums.size(); int maxs =nums[0原创 2021-03-13 13:47:28 · 102 阅读 · 0 评论 -
搜索旋转排序数组 II
一、题目:假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。示例 1:输入: nums = [2,5,6,0,0,1,2], target = 0输出: true示例 2:输入: nums = [2,5,6,0,0,1,2], target = 3输出: false进阶:这是 搜索旋转排序数组 的延原创 2021-03-12 20:46:01 · 96 阅读 · 0 评论 -
用栈实现队列
一、题目:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列的支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回 false说明:你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top,原创 2021-01-29 16:39:12 · 235 阅读 · 0 评论 -
用队列实现栈
最近刷题发现都是在做数组类型的简单题目,这样很难锻炼 到各种数据结构,决定按题目的数据结构标签类型进行刷题。先刷栈,一种先进后出的数据结构。一、题目:使用队列实现栈的下列操作:push(x) -- 元素 x 入栈pop() -- 移除栈顶元素top() -- 获取栈顶元素empty() -- 返回栈是否为空注意:你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。你所使用的语言也许原创 2021-01-29 10:54:57 · 99 阅读 · 0 评论 -
最小栈
一、题目:设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。来源:力扣(LeetCode)ps: pop、top 和 getMin 操作总是在 非空栈 上调用二、解题思路:设立两个栈,min栈顶只存放最小的元素,当我们需要最小值的时候,直接出栈即可。三、代码和结果:class MinStac原创 2021-01-28 14:53:35 · 135 阅读 · 0 评论 -
位1的个数
一、题目:编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。二、解题思路:循环遍历整个32位,如果是奇数,计数器+1,偶数计数器不变,返回计数器的大小。三、代码和结果:class Solution {public: int hammingWeight(uint32_t n) { int sum =0; for(int i = 0;i<32;i++){原创 2021-01-27 13:19:55 · 104 阅读 · 0 评论 -
多数元素
一、题目:给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。二、解题思路:先排序,组中出现次数 大于 ⌊ n/2 ⌋ 的元素一定会出现在数组中间的位置,也就是⌊ n/2 ⌋ 的位置。所以解题步骤就两步,先排序,在返回⌊ n/2 ⌋ 的值。三、代码和结果:class Solution {public: int majorityElement(vector<int>原创 2021-01-27 13:07:56 · 82 阅读 · 0 评论 -
验证回文串
一、题目:给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。二、解题思路:筛选 + 判断最简单的方法是对字符串 s进行一次遍历,并将其中的字母和数字字符进行保留,放在另一个字符串 sgood 中。这样我们只需要判断 sgood是否是一个普通的回文串即可。判断的方法有两种:第一种:使用语言中的字符串翻转 API 得到 sgood\的逆序字符串 sgood_rev,只要这两个字符串相同,那么 sgood 就是回文串。第二种(to do):是使用双指针。初始时,左右指针原创 2021-01-26 17:51:36 · 285 阅读 · 0 评论 -
两数之和 II - 输入有序数组
一、题目:给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。二、解题思路:依次循环每个元素作为第一个值,另一个值的大小则为target减去第一个值的结果,在数组剩下的元素里寻找这个结果,有就把这两个值下标+1加入容器中去。三、代码和结果:class Solution {public: vector<int> twoSum(vector<int原创 2021-01-26 17:12:05 · 114 阅读 · 0 评论 -
只出现一次的数字
只出现一次的数字一、题目:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?二、解题思路:依据题目,数组必为奇数个元素,必有一个不同的数字,且其他相同的数字都有两个。那么我们可以先排序,在用奇数位和它后面的偶数位比较,相等的话取下一个奇数位的数,如果不等,则返回奇数,如果循环到倒数第二个奇数元素还没有找到只有一个的数字的话,那么说明这个单独的数字就是最后一个数字了。三、原创 2021-01-23 20:54:18 · 64 阅读 · 0 评论 -
删除排序链表中的重复元素
删除排序链表中的重复元素一、题目:删除排序链表中的重复元素二、解题思路:1、从头结点开始:设置一个cur,将head指向它2、如果cur->next的数字等于head,那么cur->next->next作头结点的next(相当于删掉了cur->next);3、如果不相等,cur指向cur->next;4、重复23,直到结束。看到了一个很棒的图解,仅做学习记录使用,侵权删:三、代码和结果:/** * Definition for singly-linked原创 2021-01-22 12:33:31 · 164 阅读 · 0 评论 -
合并两个有序数组
合并两个有序数组一、题目给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。二、解题思路:第一种办法:将第二个数组添加到第一个数组中,然后对其排序。第二种办法:第二个数组中的元素和第一个的依次比较,小的放前面,大的放后面,一次循环直接over。(只原创 2021-01-22 12:19:35 · 196 阅读 · 3 评论 -
搜索插入位置
一、题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。二、解题思路:依次遍历数组,如果元素和所给的数字相等,则返回该索引,如果元素大于所给数字,也是返回该索引,也就是按顺序插入的位置。三、代码和结果:class Solution {public: int searchInsert(vector<int>& nums, int target) {原创 2021-01-21 13:20:11 · 75 阅读 · 0 评论