编程题
晴天码字
这个作者很懒,什么都没留下…
展开
-
GO语言刷题之用两个栈实现一个队列
题目链接list包中List是一个双向链表,可以任意插入删除元素type CQueue struct { stack1,stack2 *list.List}func Constructor() CQueue { return CQueue{ //New返回指针类型 stack1:list.New(), stack2:list.New(), }}func (this *CQueue) AppendTail(value int原创 2021-06-20 18:12:43 · 181 阅读 · 0 评论 -
树的两种非递归的先序遍历
void preOrder(TreeNode* root){ if(root==nullptr) return ; stack<TreeNode*> st; st.push(root); while(!st.empty()){ TreeNode* now=st.top(); st.pop(); cout<<now->val; if(now->right)原创 2020-08-02 16:52:25 · 146 阅读 · 0 评论 -
LeetCode_114 二叉树展开为链表
题目描述:思路:由题目可以将解题过程分为以下几个步骤:1.将当前节点的右子树连接到当前节点左子树的最右边节点的右子树上2.将当前节点的左子树连接到右子树上,并将左子树置空3.将当前节点的右子树作为新的当前节点,重复上述过程查找最右侧节点未必需要写递归,写循环也可以,所以我得出做树的问题,有时候也可以尝试使用循环来解决/** * Definition for a binary tree node. * struct TreeNode { * int val; * Tre原创 2020-08-02 16:37:36 · 159 阅读 · 0 评论 -
LeetCode_394 字符串解码
题目描述:给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。示例 1:输入:s = “3[a]2[bc]”输出:“aaabcbc”示例 2:输入原创 2020-08-01 17:58:56 · 163 阅读 · 0 评论 -
LeetCode_337 打家劫舍3
题目描述:在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。示例 1:输入: [3,2,3,null,3,null,1] 3/ \2 3\ \3 1输出: 7解释:原创 2020-07-25 14:35:56 · 145 阅读 · 0 评论 -
LeetCode_448找到数组中消失的数字
题目描述:给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。找到所有在 [1, n] 范围之间没有出现在数组中的数字。您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。示例:输入:[4,3,2,7,8,2,3,1]输出:[5,6]思路:要想使得空间复杂度为O(1),时间复杂度为O(n),则需要考虑题目的特性题目说明数组中的元素大小在数组大小范围内,则可原创 2020-07-20 22:06:43 · 99 阅读 · 0 评论 -
LeetCode_287 寻找重复数
题目描述:给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。示例 1:输入: [1,3,4,2,2]输出: 2示例 2:输入: [3,1,3,4,2]输出: 3说明:不能更改原数组(假设数组是只读的)。只能使用额外的 O(1) 的空间。时间复杂度小于 O(n2) 。数组中只有一个重复的数字,但它可能不止重复出现一次。思路:有重复的元素,所以把nums[i]num原创 2020-07-19 17:48:50 · 94 阅读 · 0 评论 -
LeetCode_283 移动零
题目描述:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数思路:统计非零元素前面的零的个数即可,然后将当前非零元素向前移动前面零的个数个位置即可,最后再数组末尾补零class Solution {public: void moveZeroes(vector<int>& nums) {原创 2020-07-19 15:56:09 · 96 阅读 · 0 评论 -
LeetCode_238 除自身以外数组的乘积
题目描述:给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。示例:输入: [1,2,3,4]输出: [24,12,8,6]提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。思路:此题可以申请两个数组left[]left[]left[]和right[原创 2020-07-19 14:39:44 · 88 阅读 · 0 评论 -
LeetCode_208.实现Trie(前缀树)
前缀树题目描述:实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。示例:Trie trie = new Trie();trie.insert(“apple”);trie.search(“apple”); // 返回 truetrie.search(“app”); // 返回 falsetrie.startsWith(“app”); // 返回 truetrie.insert(“app”);trie.search(“ap原创 2020-07-19 11:14:08 · 146 阅读 · 0 评论 -
LeetCode_207 课程表
题目描述:你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?示例 1:输入: 2, [[1,0]]输出: true解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。示例 2:输入: 2, [[1,0],[0,1]]输出: fal原创 2020-07-12 16:17:36 · 120 阅读 · 0 评论 -
LeetCode_32 最长有效括号
题目描述:给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。示例 1:输入: “(()”输出: 2解释: 最长有效括号子串为 “()”示例 2:输入: “)()())”输出: 4解释: 最长有效括号子串为 “()()”思路1:动态规划定义dpdpdp数组,dp[i]dp[i]dp[i]表示到第iii个字符为止,有效的括号长度。由于有效的括号组合最后一个符号一定是右括号")",所以只需要更新所有右括号")“的位置即可。右括号前一个括号只有两种可能”(“原创 2020-07-05 17:24:54 · 100 阅读 · 0 评论 -
LeetCode_23 合并K个排序链表
题目描述:合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[1->4->5,1->3->4,2->6]输出: 1->1->2->3->4->4->5->6思路:根据题目可知,同一个链表内部是排好序的,无需再进行比较,所以只需要比较不同链表中的元素大小即可。这里考虑使用priority_queue优先队列,优先队列内部是通过堆排序的方法实现了有序。/** * Definition原创 2020-07-05 15:36:56 · 102 阅读 · 0 评论 -
LeetCode_378 有序矩阵中第K小的元素
题目描述:给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素。示例:matrix = [[ 1, 5, 9],[10, 11, 13],[12, 13, 15]],k = 8,返回 13。提示:你可以假设 k 的值永远是有效的,1 ≤ k ≤ n2思路:此题类似于合并K个有序链表,因此可以使用相同的方法解决此题class Solution {public: //本题类原创 2020-07-05 15:17:48 · 87 阅读 · 0 评论 -
买卖股票的最佳时机3
题目描述:思路:首先需要列举所有的状态。此题共有三个状态:天数,交易次数,持有或不持有那么接下来需要做的就是列举所有的状态,并且在每种状态下做出不同的决策。for 状态1 in 状态1所有取值: for 状态2 in 状态2所有取值: ...#如果还有更多状态的话,再依次列举即可 dp[状态1][状态2][...]=最优(决策1,决策2,...)此题需要做的决策就是买入,卖...原创 2020-03-15 10:40:56 · 149 阅读 · 0 评论 -
LeetCode_416. Partition Equal Subset Sum
题目描述:思路1:动态规划class Solution {public: bool canPartition(vector<int>& nums) { int sum=accumulate(nums.begin(),nums.end(),0); if(sum&1)//奇数 return false;...原创 2020-01-09 21:24:17 · 104 阅读 · 0 评论 -
LeetCode_406. Queue Reconstruction by Height
题目描述:思路:首先按照身高,从高到低进行排序,如果身高相同,则按照第二维数据从小到大进行排序,这样可以保证每次插入people到结果队列的时候,结果队列里面的人都是比当前执行操作的人身高高的。然后就可以按照第二维的数量从结果队列的头往后数(即按照偏置值插入)bool cmp(vector<int> it1,vector<int> it2){ if(it1[0...原创 2020-01-07 15:39:45 · 98 阅读 · 0 评论 -
LeetCode_581. Shortest Unsorted Continuous Subarray
题目描述:思路:将数组排序,然后采用双指针法从前到后比较排序后数组和元素组对应元素是否相同,不同则找到始末位置。返回长度class Solution {public: int findUnsortedSubarray(vector<int>& nums) { vector<int>::iterator itb=nums.begin()...原创 2020-01-07 12:27:15 · 135 阅读 · 0 评论 -
LeetCode_448. Find All Numbers Disappeared in an Array
题目描述:思路1:排序后采用双指针法,顺序遍历序列class Solution {public: vector<int> findDisappearedNumbers(vector<int>& nums) { int i=1; int n=nums.size(); sort(nums.begin(),n...原创 2020-01-07 11:11:25 · 98 阅读 · 0 评论 -
LeetCode_394. Decode String 字符串解码
题目描述:思路:首先想到使用栈来存放数据,一个数字栈,一个字符栈。1.当遇到数字的时候就统计数字(注意数字可能会超过一位数)2.当遇到字符的时候就记录下来3.遇到’[‘时,就说明新的数字和字符串要开始了,需要将已经记录好的数字和字符串放到对应的堆栈当中4.遇到’]'时,说明已经完成了一次统计,这个时候数字栈顶元素就是当前记录的字符串应该重复的次数。然后再将字符栈顶元素取出来,加到结果字...原创 2020-01-06 12:00:07 · 114 阅读 · 0 评论 -
LeetCode_347. Top K Frequent Elements
题目描述:思路1:使用优先队列,优先队列可参考优先队列class Solution {public: vector<int> topKFrequent(vector<int>& nums, int k) { if(nums.empty()||k>nums.size()) return {}; ...原创 2020-01-05 11:47:42 · 82 阅读 · 0 评论 -
LeetCode_337. House Robber III
题目描述:思路1:暴力求解。当前节点能偷到的最大钱数有两种可能的计算方式。1.爷爷节点和孙子节点偷的钱的总和 2.儿子节点偷的钱的总和。则当前节点能偷到的最大钱数只要取一个max即可。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * ...原创 2020-01-04 11:52:40 · 103 阅读 · 0 评论 -
LeetCode_240. Search a 2D Matrix II
题目描述:思路:题目要求写一个高效率的算法,所以暴力遍历整个矩阵查找targettargettarget的方法行不通了。分析题目,发现这个矩阵是从左到右,从上到下递增的。可以发现矩阵右上角的元素是一个特殊的元素(candidatecandidatecandidate):如果targettargettarget和candidatecandidatecandidate正好相等了,说明找到了。而当...原创 2020-01-04 10:34:57 · 107 阅读 · 0 评论 -
LeetCode_287. Find the Duplicate Number
题目描述:思路:根据题目描述,n+1个空间只有范围为1~n的整数,所以必定存在重复数值,题目说有且仅有一个重复数值,所以,必定存在环。这里可以设置快慢指针。慢指针:t=nums[0]=1t=nums[1]=3t=nums[3]=2t=nums[2]=4t=nums[4]=2t=nums[2]=4…快指针:t=nums[nums[0]]=3t=nums[nums[3]]=4...原创 2020-01-03 11:14:25 · 82 阅读 · 0 评论 -
LeetCode_234. Palindrome Linked List
题目描述:思路1:申请一个vector,把链表中的元素都复制到vector中,然后用双指针从两端向中间比较/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL...原创 2020-01-02 21:12:03 · 92 阅读 · 0 评论 -
LeetCode_206. Reverse Linked List
题目描述:Reverse a singly linked list.Example:Input: 1->2->3->4->5->NULLOutput: 5->4->3->2->1->NULL思路1:原地反转链表(循环方式)/** * Definition for singly-linked list. * struct L...原创 2020-01-02 12:01:51 · 93 阅读 · 0 评论 -
LeetCode_160. Intersection of Two Linked Lists
题目描述:思路1:申请一个vector,用来存放其中一条链表的所有节点,当遍历另外一条链表时,如果该节点已经在vector中存放过了,说明找到了第一个相交的节点。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNod...原创 2020-01-02 11:36:04 · 94 阅读 · 0 评论 -
LeetCode_146. LRU Cache
题目描述:思路:解题思路class LRUCache {public: LRUCache(int capacity) { n=capacity; } int get(int key) { auto it=m.find(key); if(it!=m.end()){ int ans=it-...原创 2020-01-01 20:26:39 · 114 阅读 · 0 评论 -
LeetCode_155. Min Stack
题目描述:思路:设置两个stackstackstack,datadatadata和min_datamin\_datamin_data,分别用于存放加入stack中的数据和stack中最小的数据。class MinStack {public: /** initialize your data structure here. */ MinStack() { ...原创 2020-01-01 12:11:43 · 108 阅读 · 0 评论 -
LeetCode_148. Sort List
题目描述:思路1:遍历链表并记录数据,然后将数据采用sort()排序(时间复杂度O(logn)),然后从头到尾把排好序的元素更新到链表中/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : va...原创 2019-12-31 13:18:37 · 118 阅读 · 0 评论 -
LeetCode_142. Linked List Cycle II
题目描述:思路1:建立一个vector用来存放已经访问过的链表节点,如果没有访问过,则添加到vector中并继续向后访问,否则则是cycle的入口节点。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int...原创 2019-12-30 12:11:22 · 106 阅读 · 0 评论 -
LeetCode_141. Linked List Cycle
题目描述:思路1:申请一个vector用来存放已经访问过的节点,在遍历链表的过程中,如果发现已经访问过该节点,则说明链表存在环,否则不存在/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : v...原创 2019-12-29 21:03:50 · 103 阅读 · 0 评论 -
LeetCode_138. Copy List with Random Pointer
题目描述:思路:设置一个map,用来存放旧链表节点和新链表节点,(key,value)->(旧链表节点,新链表节点)注意:这道题不要被他给的样例所迷惑,对应的下标random_index根本没用,就按照正常思路求解即可/*// Definition for a Node.class Node {public: int val; Node* next; N...原创 2019-12-29 11:47:23 · 100 阅读 · 0 评论 -
剑指offer——构建乘积数组
题目描述:给定一个数组A[0,1,...,n−1]A[0,1,...,n-1]A[0,1,...,n−1],请构建一个数组B[0,1,...,n−1]B[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[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]B[...原创 2019-12-25 11:08:08 · 75 阅读 · 0 评论 -
剑指offer——不用加减乘除做加法
题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:分三步1)不考虑进位,只是对两个数进行按位异或(二进制异或就是对应位相加)2)统计进位3)将进位添加到上面的不考虑进位时得到的结果上class Solution {public: int Add(int num1, int num2) { int sum=0;...原创 2019-12-23 20:14:38 · 79 阅读 · 0 评论 -
剑指offer——把字符串转换成整数
题目描述:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。思路:遍历字符串,将字符串逐个字符进行转换。注意需要判断是否溢出class Solution {public: int StrToInt(string str) { if(str.empty()) return 0; ...原创 2019-12-23 19:39:27 · 86 阅读 · 0 评论 -
剑指offer——求1+2+3+...+n的和
题目描述:求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)思路1:使用构造函数,创建n个类对象,利用构造函数进行求和计算class Temp{public: Temp(){ N++; sum+=N; } static void reset(){ ...原创 2019-12-23 16:00:05 · 132 阅读 · 0 评论 -
剑指offer——圆圈中最后剩下的数字
题目描述:每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后...原创 2019-12-21 20:16:50 · 86 阅读 · 0 评论 -
剑指offer——扑克牌中的顺子
题目描述:LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5...原创 2019-12-21 19:18:45 · 285 阅读 · 0 评论 -
剑指offer——数组中的逆序数对
题目描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007输入描述:题目保证输入的数组中没有的相同的数字数据范围:对于%50的数据,size<=10^4对于%75的数据,size<=10^5对于%100的数据,siz...原创 2019-12-20 15:39:45 · 76 阅读 · 0 评论