leetcode刷题
small_tomato
这个作者很懒,什么都没留下…
展开
-
leetcode(三十六)反转链表
方法一:使用栈,注意,在每次出栈将指针指向出栈的元素,然后将指针指向自己的next之后,一定要注意再将指针的next为NULL,否则会报错。 class Solution { public: ListNode* reverseList(ListNode* head) { ListNode * hd = new ListNode; stack<ListNode*> array; while(head!=nullptr) {原创 2021-10-20 22:21:37 · 92 阅读 · 0 评论 -
leetcode(三十五)合并两个有序链表(数据结构处)
方法一: 定义一个头结点,一个指向头结点的指针,最后返回指向头节点的指针的next: class Solution { public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode *pNote=new ListNode(0); ListNode *p = pNote; while(l1&&l2) { if(l原创 2021-10-19 22:27:06 · 79 阅读 · 0 评论 -
leetcode(三十四)移除链表元素
方法一: 迭代: class Solution { public: ListNode* removeElements(ListNode* head, int val) { if(head==nullptr) return head; ListNode *l1 = new ListNode(0,head); ListNode *l2 = l1; while(l1->next!=nullptr)原创 2021-10-19 22:08:08 · 79 阅读 · 0 评论 -
leetcode(三十三)环形链表
给定一个链表,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。 如果链表中存在环,则返回 true 。 否则,返回 false 。 方法一: 哈希表。 class Solution { public: bool hasCycle原创 2021-10-19 21:30:18 · 45 阅读 · 0 评论 -
leetcode(三十二)有效的字母异位词
方法一:哈希表 需要注意的是对哈希表遍历时得到的迭代器不需要用->,使用.即可。 class Solution { public: bool isAnagram(string s, string t) { unordered_map<int,int> array; for(int i =0;i<s.length();i++) { auto iter = array.find(s[i]);原创 2021-10-19 20:54:59 · 57 阅读 · 0 评论 -
leetcode(三十一)赎金信
方法:简单的哈希表应用 class Solution { public: bool canConstruct(string ransomNote, string magazine) { unordered_map<int,int> array; for(auto nums:magazine) { array[nums]++; } for(auto nums:ransomNote)原创 2021-10-19 20:08:06 · 41 阅读 · 0 评论 -
leetcode(三十)字符串中的第一个唯一字符
方法:简单的哈希表应用。 class Solution { public: int firstUniqChar(string s) { unordered_map<int,int>array; for(auto num:s) { array[num]++; } for(int i = 0; i <s.length(); i++) {原创 2021-10-19 19:59:40 · 55 阅读 · 0 评论 -
leetcode(二十九)矩阵置零
方法:标记数组,标记为0的元素的行或者列,然后遍历原数组,标记数组为1对应的行和列置0. class Solution { public: void setZeroes(vector<vector<int>>& matrix) { int m = matrix.size(); int n = matrix[0].size(); int array1[m]; int array2[n];原创 2021-10-17 21:18:53 · 35 阅读 · 0 评论 -
leetcode(二十八)有效的数独
方法:设置三个数组,两个二维一个三维,二维中的第一维存行和列第二维存数字(对应数字的下标为1),然后三维数组前二维分别是第几个3*3的元素,第三维存数字。由于数组元素为字符,因此需要减去'0'确保得到的值为数字。 class Solution { public: bool isValidSudoku(vector<vector<char>>& board) { int row[9][9]; int col[9][9];原创 2021-10-17 21:17:20 · 36 阅读 · 0 评论 -
leetcode(二十七)杨辉三角
方法:每次存数组前先重塑数组的长度,然后第一个和最后一个元素设为1,从第三行的第二个元素开始,该位置的值等于上一行的该位置的元素和上一行的该位置的元素的和。 class Solution { public: vector<vector<int>> generate(int numRows) { vector<vector<int>> array(numRows); for(int i =0;i<num原创 2021-10-17 21:14:30 · 123 阅读 · 0 评论 -
leetcode(二十六)重塑矩形
class Solution { public: vector<vector<int>> matrixReshape(vector<vector<int>>& mat, int r, int c) { int m = mat.size(); int n = mat[0].size(); if(r*c!=m*n) return mat; vector<.原创 2021-10-17 21:11:01 · 57 阅读 · 0 评论 -
leetcode(二十五)买卖股票的最佳时机
方法:自我解法,存储最小的元素,然后用后面的减,若结果小于0,则将后面的存为最小的元素,每次得到大于0的数字则存储与下一个大于0的数字比较。 class Solution { public: int maxProfit(vector<int>& prices) { int temp = 0; int max = 0; temp = prices[0]; for(int i =1;i<prices.size(原创 2021-10-17 21:10:02 · 44 阅读 · 0 评论 -
leetcode(二十四)两个数组的交集Ⅱ
方法:哈希表 新建一个哈希表unordered_map<int,int> 先遍历第一个数组,将出现的元素的哈希表位置进行加一操作,再遍历第二个元素,如果存在于哈希表中,则进行减一操作,如果此处数字为0,则删除该位置的元素(通过迭代器删除) class Solution { public: vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {原创 2021-10-17 21:07:18 · 65 阅读 · 0 评论 -
leetcode(二十三)存在重复元素
方法一: 数据结构:unordered_set<int>array; 使用了操作:find,insert。 class Solution { public: bool containsDuplicate(vector<int>& nums) { unordered_set<int> array; for(int i =0 ;i<nums.size();i++) { if(.原创 2021-10-13 19:30:40 · 54 阅读 · 0 评论 -
leetcode(二十二)相同的树
方法一: 递归。(深度优先遍历思想) class Solution { public: bool isSameTree(TreeNode* p, TreeNode* q) { if(p==nullptr&&q==nullptr) return true; //p和q都为空指针,则为同一棵树 if(p==nullptr||q==nullptr) return false; //p和q其中一个为空,不为同一棵树 if(p-&原创 2021-10-12 22:01:02 · 74 阅读 · 0 评论 -
leetcode(二十一)二叉树的中序遍历
方法一: 递归写法。 class Solution { private: vector<int> array; public: vector<int> inorderTraversal(TreeNode* root) { if(root==nullptr) return array; if(root->left!=nullptr) inorderTraversal(ro原创 2021-10-11 21:24:52 · 86 阅读 · 0 评论 -
leetcode(二十)合并两个有序数组
方法一:快速排序。(整了很久,还是基础不到位) class Solution { void QuickSort(vector<int> & num , int left,int right) { if(left>=right) return ; int L = left; int R = right; int target = num[left]; while(left<right) { wh原创 2021-10-10 20:47:43 · 45 阅读 · 0 评论 -
leetcode(十九)删除排序链表
写法一: 定义双指针。 class Solution { public: ListNode* deleteDuplicates(ListNode* head) { if(head==nullptr) return nullptr; ListNode * p = head; ListNode * p1 = head->next; while(head->next !=nullptr)原创 2021-10-08 20:19:17 · 62 阅读 · 0 评论 -
leetcode(十八)爬梯子
使用动态规划,我们可以知道,当爬第n层时候,因为一次只能爬两格或者一格,因此f(n)=f(n-1)+f(n-2)。 写法一: 递归,时间会超出限制,但是使用别的编译器,返回结果是正确的。 class Solution { public: int climbStairs(int n) { int result = 0; if(n==0||n==1) return 1; result = climbStairs(n-1)+c原创 2021-10-07 20:30:28 · 121 阅读 · 0 评论 -
leetcode(十七)Sqrt
方法一:二分查找,通过设置起始位置为0,结束位置为x,使用二分查找, 当中间的值小于目标值时更新输出值(大于一定不是)。 class Solution { public: int mySqrt(int x) { int start = 0; int end = x; int mid = 0; int result = 0; while(start<=end) { mid = (start+end原创 2021-10-06 19:36:53 · 92 阅读 · 0 评论 -
leetcode(十六)二进制求和
掌握String的新方法:reverse(start,end),倒置string数组从start到end位置的元素,彻底掌握string的基础操作,包括insert,at,以及用数组的方式取出string里面的元素以及从string里面取出来元素。掌握进位方法:设置一个值carry,让他carry/=2,即对2整除,能整除说明可以进位(二进制中),不能整除说明有进位,这意味传值为carry%2,因为有可能上一位有进位,这一位是1+1。以及本体一个比较妙的思想,采用string中的元素是否等于1来决定该位的值原创 2021-10-05 20:48:31 · 63 阅读 · 0 评论 -
leetcode(十五)加一
没什么好说的,先加1,再遍历判断进位,唯一需要注意的是开头是否会溢出。 class Solution { public: vector<int> plusOne(vector<int>& digits) { int size = digits.size(); digits[size-1]++; for(int i =size-1;i>=0;i--) { if((digit原创 2021-10-04 19:52:07 · 44 阅读 · 0 评论 -
leetcode(十四)最后一个单词的长度
使用反向遍历方法。写法一: class Solution { public: int lengthOfLastWord(string s) { int start; int sum = 0; for(int i = s.length()-1;i>=0;i--) { if(s.at(i)!=' ') { start = i;原创 2021-10-03 19:42:09 · 41 阅读 · 0 评论 -
leetcode(十三)最大子序和
方法:动态规划。 基本思想:计算以i为下标结尾的数组的最大子序列值,然后将最大的值与存储的i-1的最大值比较。 class Solution { public: int maxSubArray(vector<int>& nums) { int MaxEnd = nums[0]; int MaxValue = nums[0]; for(int i =1; i<nums.size();i++) {原创 2021-09-30 11:29:20 · 38 阅读 · 0 评论 -
leetcode(十二)搜索插入位置
方法一:递归版二分查找 class Solution { public: int searchInsert(vector<int>& nums, int target) { int left = 0; int right = nums.size()-1; return splitFind(nums,left,right,target); } int splitFind(vector<i原创 2021-09-29 15:55:58 · 111 阅读 · 0 评论 -
leetcode(十一)实现strStr
方法一:暴力破解 class Solution { public: int strStr(string haystack, string needle) { int flag = 0; int length = 0; int nSize = needle.length(); int hSize = haystack.length(); if(nSize==0) return 0;原创 2021-09-28 10:05:59 · 43 阅读 · 0 评论 -
leetcode(十)移除元素
方法一:双指针(首末版) class Solution { public: int removeElement(vector<int>& nums, int val) { int size = nums.size(); int end = nums.size(); int start = 0; int length = 0; while(start<end) { .原创 2021-09-27 17:26:29 · 40 阅读 · 0 评论 -
leetcode(九)删除有序数组中的重复项
所有的方法的思想都是设置两个值,指向不同的元素,当指向的元素相同的时候,前面的指向不变,后面的指向向后移动,当指向的元素不相同的时候,前面的指向往后移动一位,后面的指向赋值给移动完后的前面的指向,然后自己再向后移一位。 方法一:指针法 class Solution { public: int removeDuplicates(vector<int>& nums) { if(nums.empty()) return 0;原创 2021-09-26 10:24:48 · 38 阅读 · 0 评论