leetcode编程
文章平均质量分 50
Dream_yz
没有最好,只有更好!
展开
-
leetcode_188 Best Time to Buy and Sell Stock IV
题目分析:用一个数组表示股票每天的价格,数组中第i个数表示股票在第i天的价格。最多可以交易k次,但手上只能持有一支股票,求此时的最大收益。解题思路:动态规划求解1)如果交易次数大于股票变化的天数,次数利用贪心法求解最大收益即可。2)如果不满足1),则从所有的价格变化序列中,挑选出2*k个元素,组成交易,交易过程为交替进行。此时利用动态规划进行求解。利用两个数组分别记录:当前到达第i天最多可以进原创 2016-04-09 22:52:16 · 731 阅读 · 0 评论 -
leetcode_345 Reverse Vowels of a String
题目分析:给定一个字符串,把字符串中的元音字符转置解题思路:1)定义两个指标i,j,分别指向字符串最前端和字符串最尾端;2)遍历字符串,判断字符串中对应位置字符是否为元音字符,如果是元音字符,停止遍历,然后在另一方向找到对应位置的元音字符位置,找到后,将两个位置字符进行交换,然后继续遍历,直到遍历结束。3)遍历方式类似于快速排序中的遍历调整位置。实现程序C++版本class Solution原创 2016-05-12 21:04:34 · 1948 阅读 · 0 评论 -
leetcode_347 Top K Frequent Elements
题目分析:给定一个数组,返回数组中出现此多最多的k个元素,要求时间复杂度小于O(nlogn)。解题思路:1)利用map实现统计数组中每个元素出现的次数;2)对1)统计的map按照元素出现的次数进行排序,此时需要自己定义一个变量,主要实现将map中元素与次数交换位置;3)依据2)排序的结果,取出排序次数最靠前的k个元素对应的元素值即可。实现程序C++版本// 此函数主要实现,将次数放在第一的位置,原创 2016-05-12 22:04:11 · 2102 阅读 · 0 评论 -
leetcode_096 Unique Binary Search Trees
题目分析:对于给定的数n,求由n个数构成的所有不同二分查找树的数目。解题思路:动态规划二分查找树:左子树节点值小于root节点值,右子树节点值大于root节点值。n个节点,每个节点都可以作为root节点,然后将小于root节点值的节点全部放入左子树,将大于root节点值的节点全部放入右子树,然后计算出左子树放置的种类,和右子树放置的种类,两个种类数相乘,即为以此root节点值为根的二分查找树的原创 2016-05-02 23:12:35 · 409 阅读 · 0 评论 -
leetcode_137 Single Number II
题目分析:给定一个数组,里面只有一个数只出现一次,其他的数均出现三次,请找出这个只出现一次的数。解题思路:方法1 利用map实现1)遍历整个数组,统计数组中每个数出现的次数,并将其保存在map种2)遍历数组中元素,查看map中对应元素出现的次数,如果出现只出现一次,则返回次元素,并结束程序即可。方法2 统计数组数的各个位之和1)int类型是32位数,对数组中所有数(32位int类)的各个位进行求原创 2016-05-27 23:21:12 · 570 阅读 · 0 评论 -
leetcode_138 Copy List with Random Pointer
题目分析:给定一个特殊的单链表,链表的每一个节点多了一个随机指针域,随机指向链表中的某一个节点。要求复制这个链表解题思路:1)复制节点,并将拷贝后的节点插入到原节点的后面;2)更新所有复制的节点的random节点,即:h.next.random = h.random.next;3)将原链表与复制的链表断开。补充:也可以利用map来保存random节点之间的关系,通过递归或非递归来实现。实现程序C原创 2016-05-28 17:00:49 · 1096 阅读 · 0 评论 -
leetcode_349 Intersection of Two Arrays
题目分析:给定两个数组,求数组的交集。输出结果中的元素唯一,输出数组可以无序。解题思路:1)对数组nums1进行排序;2)对数组nums2进行排序;3)遍历数组nums1和nums2中元素,并比较对应的元素,若相等,则判断其值是否与结果中最后保存的元素是否相等,相等则直接变化两个索引,否则将该值保存到结果中,并变化两个索引不等,则变化较小元素对应的索引即可。实现程序C++版本class Sol原创 2016-05-28 18:13:55 · 2947 阅读 · 0 评论 -
leetcode_350 Intersection of Two Arrays II
题目分析:给定两个数组,求数组的交集。输出结果中的元素不唯一,输出数组可以无序。解题思路:1)对数组nums1进行排序;2)对数组nums2进行排序;3)遍历数组nums1和nums2中元素,并比较对应的元素,若相等,则将其保存到输出结果中,并变化两个数组对应的索引不等,则变化较小元素对应的索引即可。实现程序C++版本vector<int> intersect(vector<int> &num原创 2016-05-28 18:17:30 · 3672 阅读 · 0 评论 -
leetcode_091 Decode Ways
题目分析:对给定的一串数字,将其解码成对应的英文字母解题思路:递归实现(超时)1)根据当前字符串中起始字符是否为1或起始字符为2且下一字符是否小于6进行不同的的递归;2)每次递归,字符串长度相应的减小,最后根据当前字符串的长度是否为0,1或者字符串为’0’为递归的终止条件。动态规划实现1)设置一个数组dp[n+2]用来存放遍历到每个字符时,对应的编码个数,并将对应数组中元素初始化为1;2)遍原创 2016-04-21 12:22:05 · 463 阅读 · 0 评论 -
leetcode_092 Reverse Linked List II
题目分析:给定一个链表和一个区间的两个值,实现将链表中的该区间节点进行逆转操作。解题思路:方法1找到链表中的m节点和n节点,然后执行reverse函数,将此区间的链表逆转,注意要保存m的前一个节点和n的后一个节点,逆转完成后将链表串接在一起。方法2首先直到m节点时,保存m节点的前一个节点pre,然后将m后的节点依次插入到pre的后面即可。实现程序// 逆转链表操作函数 void reve原创 2016-04-21 12:39:00 · 398 阅读 · 0 评论 -
leetcode_136 Single Number
题目分析:给定一个数组,里面只有一个数只出现一次,其他的数均出现两次,请找出这个只出现一次的数。解题思路:方法1 利用map实现1)遍历整个数组,统计数组中每个数出现的次数,并将其保存在map2)遍历数组中元素,查看map中对应元素出现的次数,如果出现只出现一次,则返回次元素,并结束程序即可。方法2 利用异或实现由于两个相同的数进行异或,结果为0,故将所有的数进行异或操作,最后得到的数一定为数组原创 2016-05-25 23:15:32 · 509 阅读 · 0 评论 -
leetcode_090 Subsets II
题目分析:对给定的数组(数组中可能存在重复元素),求该数组的所有子集。解题思路:dfs实现1)首先对数组进行排序;2)利用dfs求排序后数组的所有子集。注意:当dfs处理中出现重复元素时,则进行跳过处理即可。实现程序class Solution{ vector< vector<int> > subsetsWithDup(vector<int> &nums) {原创 2016-04-17 23:18:20 · 407 阅读 · 0 评论 -
leetcode_089 Gray Code
题目分析:对给定的n,求0~2^(n-1)按照特定顺序排序,其中第一个数必须为0,相邻两个数的二进制表示有且只有一位不同,即求n位数的格雷码操作。解题思路:二进制转格雷码实现假设3为的二进制数,对应的二进制数和格雷码分别如下:二进制数: 000 001 010 011 100 101 110 111格雷码: 000 001 011 010 110 111 101 100二进制码转格雷码使用异或原创 2016-04-17 22:46:52 · 458 阅读 · 0 评论 -
leetcode_309 Best Time to Buy and Sell Stock with Cooldown
题目分析:用一个数组表示股票每天的价格,数组中第i个数表示股票在第i天的价格。 可以进行多次交易,但在存在两个限制条件:1)不可以同时进行多次交易(必须卖出股票前再买一次股票);2)售出股票后,不能在第二天在买股票(冷冻期);求此时的最大收益。解题思路:动态规划求解此题原前面题目的最大区别在于,股票交易过程中存在冷冻期,即如果某天买了股票,那么第二天不能买股票。解题过程中需要维护三个数组:bu原创 2016-04-09 23:07:12 · 1085 阅读 · 0 评论 -
leetcode_083 Remove Duplicates from Sorted List II
题目分析:从有序的链表中,将出现重复的元素全部去除。如1->2->2->3,去除重复后为1->3解题思路:快慢指针实现定义两个指针,一个指针pre指向当前最终无重复链表的最后一个元素,一个指针cur用于遍历时指向的当前指针,一遍遍历链表;判断pre->next的元素与cur的元素是否相等,相等,则cur向前移动,继续判断;当pre->next的元素不等于cur的元素,此时判断pre的next是原创 2016-03-28 23:08:28 · 452 阅读 · 0 评论 -
leetcode_118 Pascal Triangle
题目分析:给定整数n,生成杨辉三角的前n行解题思路:依据杨辉三角新值求解杨辉三角性质:1)每行第一个元素和最后一个元素值为1;2)每行非第一个和最后一个元素值为:tri[i][j] = tri[i-1][j-1] + tri[i-1][j]实现程序class Solution{ public: vector< vector<int> > generate(int n原创 2016-04-10 22:36:20 · 410 阅读 · 0 评论 -
leetcode_109 Pascal Triangle II
题目分析:给定整数n,生成杨辉三角的第n行数据信息。解题思路:依据杨辉三角性质求解本题较上一个题目主要区别在于本题只求单独某一行元素,此时相当将求二维信息转换为求一维信息。杨辉三角性质:1)杨辉三角第i行共有i+1个数据;其中第一个元素和最后一个元素值为1;2)第i行元素非第一个和最后一个元素值为肩上两个元素相加求得,当利用一个数组进行求解时,则对应计算公式为tri[j] = tri[j] +原创 2016-04-10 22:53:25 · 450 阅读 · 0 评论 -
leetcode_321 Create Maximum Number
题目分析:给定两个长度分别为m和n的数组,数组元素为0-9,每个数组元素代表一个数字。从这两个数组中选出一些数字,组成一个数组,是这个数组中的数尽可能大,其长度k <= m + n。要求数组中选出的元素的相对顺序与原数组保持一致。最终返回一个包含k个数字的数组。解题思路:1)分别从nums1(长度为m)和nums2(长度为n)中挑选出i(max(0, k - n) <= i <= min(m, k原创 2016-05-10 22:51:58 · 2853 阅读 · 0 评论 -
leetcode_322 Coin Change
题目分析:零钱对换,用最少的零钱数,换取目标的数量。解题思路:动态规划求解1)dp[i]表示对换目标i所需的最少硬币数目;2)计算过程中的动态规划公式为dp[i+coins[j]] = min(dp[i+coins[j], dp[i]+1)。实现程序C++版本class Solution { public: int coinChange(vector<int> &coins,原创 2016-05-10 20:04:01 · 866 阅读 · 0 评论 -
leetcode_328 Odd Even Linked List
题目分析:给定一个单向链表,要求将所有的奇数位置的节点放到前面,如1->2->3->4->5->NULL,则进行变换后,得到的链表为1->3->5->2->4->NULL。解题思路:1)一遍遍历链表,将链表分为奇数链表和偶数链表2)将1)中得到的奇数链表与偶数链表进行挂接,从而得到最终的奇偶链表。实现程序C版本// 奇偶链表操作struct ListNode *oddEvenList(stru原创 2016-05-11 22:30:23 · 485 阅读 · 0 评论 -
leetcode_033 Search in Rotated Sorted Array
题目分析:在旋转后的有序数组中查找某个元素。解题思路:两种方法实现方法1:遍历实现1)先判断要查找的数与数组头元素和数组尾元素大小,确定遍历方向;2)以一定的方向遍历查找,判断是否存在次元素。注意:遍历过程中若出现逆序情况,则说明不存在此元素。方法2:利用二分查找实现。1)若target == A[mid],直接返回mid即可;2)若A[first] <= A[mid]时,判断target是否原创 2016-03-31 22:27:02 · 383 阅读 · 0 评论 -
leetcode_088 Merge Sorted Array
题目分析:针对两个有序的数组A和B,A数组的长度为m,B数组的长度为n,假设A有足够的空间容纳B数组,实现A和B数组的合并操作。解题思路:遍历比较赋值实现1)使用三个位置指针i,j,k,初始时分被指向A数组最末元素、B数组最末元素、和融合后数组的最末元素位置;2)比较A[i]与B[i]大小,将较大的值赋值给合并后的数组A[k];3)依据2)中合并的情况移动i,j,k位置指针的位置;4)循环执行原创 2016-04-17 22:27:42 · 459 阅读 · 0 评论 -
leetcode_082 Remove Duplicates from Sorted List
题目分析:从有序的链表中,去除重复数,得到最后的链表,链表中每个元素最多出现一次。解题思路:快慢指针实现定义两个指针,一个快指针,一个慢指针,一遍遍历链表;判断快指针和慢指针中存放的值是否相等,相等则跳过快指针,且快指针向前移动;不相等则同时移动快慢指针即可。实现程序ListNode * deleteDuplicates(ListNode *head){ // 空链表或只有一个元素原创 2016-03-28 22:54:58 · 392 阅读 · 0 评论 -
leetcode_095 Unique Binary Search Trees II
题目分析:对于给定的数n,n表示二叉树的节点总数,求n个节点能够表示的所有二叉树。解题思路:递归求解对于所有可能的二叉树,二叉树的数目为卡特兰数,不是一个多项式时间的数量级,求解的所有树,而显示时间内不能完成。其求解方法采用递归。实现程序vector<TreeNode *> createTree(int start, int end){ vector<TreeNode *> res原创 2016-05-05 21:00:00 · 393 阅读 · 0 评论 -
leetcode_335 Self Crossing
题意分析: 定一个数组x,代表行走的距离,最初的方向是北,每走一步就按逆时针顺序变化方向(北,西,南,东)要求只遍历一次x,并且用O(1)的存储空间,判断走过的路径是否交叉。解题思路: 方法1:分南北和东西方向进行判断出现交叉的情况是:第四条边和第一条边相交,需满足条件是第一条边大于等于第三条边,第四条边大于等于第二天便。同样适用于第五条边和第二条边相交,第六条边与第三条边相交等等,依次向后类推,原创 2016-06-20 20:36:19 · 773 阅读 · 0 评论 -
leetcode_Best Time to Buy and Sell Stock III
题目分析:用一个数组表示股票每天的价格,数组中第i个数表示股票在第i天的价格。最多只能交易两次,且手上最多能持有一支股票,求最大收益。 解题思路:动态规划求解假设以第i(0 <= i <= n-1)填为中间卖出也即下次交易的买入,则最大收益为max{preprofit[i] + postprofit[i]}。具体实现分三步:1)从前到后遍历,求第一次交易的最大值;2)从后向前遍历,求第二次交易原创 2016-04-09 22:04:54 · 530 阅读 · 0 评论 -
leetcode_373 Find K Pairs with Smallest Sums
题目分析给定两个递增的数组,从每个数组中任意取出一个数来组成不同的数字对,求前k个最小的数字对。 解题思路:方法1 利用暴力求解法; 方法2 借助STL中的multimap实现; 方法3 借助STL中的priority_queue实现。实现程序static bool cmp(pair<int, int> a, pair<int, int> b){ if (a.first + a.原创 2016-08-29 19:30:52 · 747 阅读 · 0 评论 -
leetcode_389 Find the Difference
题目分析给定两个字符串s和t,都只包含小写字母,字符串t是由字符串s打乱顺序且在额外的随机位置上添加一个字符组成,请找出这个字符。解题思路1)利用一个数组,先统计s字符串中每个字符出现的次数,然后统计t字符串中的次数,最后找出差异的字符串即可。 2)可以利用hash_map来进行统计实现。实现程序// 方法1 利用数组实现char findTheDifference(string s, s原创 2016-08-29 20:37:18 · 2864 阅读 · 1 评论 -
leetcode_383 Ransom Note
题目分析给定两个字符串magazines和ransomNote,判断是否可以从magazines中抽取字母(每个字母只能用一次)组成ransomNote。字符串均由小写字母组成。解题思路1)统计ransomNote中每个字符出现的次数; 2)然后统计magazines中字符出现的次数; 3)判断ransomNote中的字符是否全部包含在magazines中即可。实现程序bool canCo原创 2016-08-29 23:08:44 · 843 阅读 · 0 评论 -
leetcode_387 First Unique Character in a String
题目分析给定一个字符串,找出该字符串中第一个不重复的字符,并返回其对应的下标。如果不存在,则返回-1。解题思路首先遍历字符串,统计每个字符出现的次数,然后在遍历字符串,找出第一个只出现一次的字符即可。实现程序int firstUniqChar(string s){ if (s.length() <= 0) return -1; vector<int> temp原创 2016-08-29 22:44:55 · 755 阅读 · 0 评论 -
leetcode_388 Longest Absolute File Path
题目分析给定一个字符串,表示文件系统的目录结构。统计该目录结构中的一个文件的绝对路径的最大长度。解题思路利用\n来分割文件夹和文件名,利用\t来统计此时文件夹或文件对应的层数,然后利用哈希表来建立深度和当前深度的绝对路径长度之间的映射。实现程序int lengthLongestPath(string input){ int result = 0; int size = inp原创 2016-08-30 12:40:15 · 1567 阅读 · 0 评论 -
leetcode_377 Combination Sum IV
题目分析定一个无重复的正整数数组,计算得到一个目标正整数的所有组合方式的个数。解题思路利用动态规划进行求解,其初始值dp[0] = 1;动态规划转移方程为dp[i] += dp[i - num[j]],其中dp[i]表示生成数字i的所有可能的组合方式的个数。C++实现int combinationSum4(vector<int>& nums, int target){vector<int>原创 2016-09-14 21:20:18 · 635 阅读 · 0 评论 -
leetcode_378 Kth Smallest Element in a Sorted Matrix
题目分析给定一个n*n的矩阵,其中每一行每一列都按照递增排序,寻找矩阵中的第k小元素。注意,是要寻找排好序的第k小元素,而不是第k个不重复元素。解题思路1)利用堆来实现。直接维护一个大小为k的堆,全部读入一边,这样平均和最好时间情况都为O(n*logk)。 2)利用二分查找实现。C++实现struct Node{ int val; int i; int j;原创 2016-09-14 22:17:55 · 739 阅读 · 0 评论 -
leetcode_337 House Robber III
题意分析:给定一棵二叉树,求能获取的权值最大和(相邻的不能同时取)解题思路: 方法1:利用哈希表和递归回溯实现当前的计算需要依赖之前的结果,对于某一个节点,如果其左子节点存在,通过递归调用函数计算不包含坐姿节点的返回值,如果右子节点存在,通过递归调用函数,算法不包含右子节点的返回值,对应此节点的最大值存在两种情况:一是该节点值加上不包含左子节点和左子节点的返回值之和,另一种是左右子节点返回值之和不原创 2016-06-20 19:50:15 · 623 阅读 · 0 评论 -
leetcode_355 Design Twitter
题意分析:设计简单的Twitter,用户可以发送推文,关注、取消关注另一名用户,并且可看到10条最新的推文推送。设计中需要支持推送,获取最新10条用户新闻推送,关注人关注一名用户,关注人取消一名用户等。解题思路: 方法1:可以利用两个哈希表来做,第一个是建立用户和其所有好友之间的映射,另一个是建立用户和其所有消息之间的映射。由于获得新鲜事需要按时间顺序排列,故可以用一个整型变量cnt来拟时间点,没原创 2016-06-20 17:09:49 · 697 阅读 · 0 评论 -
leetcode_354 Russian Doll Envelopes
题意分析:给定一些信封的宽和长,当且仅当信封x的宽和长均小于另一个信封y时,x可以装入y,求最多可以嵌套的装几个?解题思路: 利用动态规划进行求解。首先利用信封的宽度进行排序,然后遍历信封,找长度满足条件的信封数目,从而更新dp数组,dp[i] = max(dp[i], dp[j+1])。同时更新result,result= max(result, dp[i])即可。C++实现// 排序然后查找原创 2016-06-20 14:46:26 · 779 阅读 · 0 评论 -
leetcode_098 Validate Binary Search Tree
题目分析:判断一颗二叉树是否为二分查找树解题思路:中序遍历二分查找树满足条件:左子树的值都比根节点小;右子树的值都比根节点大;左右子树必须满足这两个条件。对于二分查找树,其中序遍历将得到一个有序的序列。故采用中序遍历实现。递归求解先判断根节点是否满足条件,然后分别递归判断左子树和右子树。实现程序方法1:中序遍历//中序遍历void InOrderTree(struct TreeNode原创 2016-05-05 21:24:39 · 496 阅读 · 0 评论 -
leetcode_097 Interleaving String
题目分析:给定字符串s1,s2,s3,判断s3是否可能由s1和s2交错组合而成。交错指前后顺序不变的交叉解题思路:递归求解一个一个字符的判断,判断过程中利用递归实现。时间复杂度为O(2^(m+n));动态规划定义状态dp[i+1][j+1]:表示s1[0,…,i]与s2[0,…,j]能够交替形成s3[0,…,i+j+1]部分。状态转移方程为:dp[i+1][j+1] = (dp[i][j+1原创 2016-05-05 21:10:55 · 369 阅读 · 0 评论 -
leetcode_344 Reverse String
题目分析:对于给定的字符串,执行逆转操作。解题思路:先统计字符串的长度,然后遍历字符串,将字符串的前后元素一一对调即可实现。实现程序C++版本class Solution {public: // 字符交换操作 void my_swap(char *s, char *t) { char temp = *s; *s = *t;原创 2016-05-08 18:45:02 · 2054 阅读 · 0 评论 -
leetcode_342 Power of Four
题目分析:给定一个32位有符号整型数,判断其是否是4的幂次。解题思路:首先,判断整型数是否小于等于0,如果小于等于0,则一定不是4的幂次;然后,对整型数与4取余,如果余数为0,则将整型数除以4,继续判断,直到整型数不大于1位置。实现程序// 版本1实现,直接利用取余,然后除4计算bool isPowerofFour(int num){ if (num <= 0) re原创 2016-05-08 19:32:54 · 509 阅读 · 0 评论