leetcode刷题
文章平均质量分 50
用于整理在leetcode上刷题的相关总结
Dream_yz
没有最好,只有更好!
展开
-
Leetcode_027 Remove Element
Question:Given an array and a value, remove all instances of that value in place and return the new length.The order of elements can be changed. It doesn't matter what you leave beyond the n原创 2015-05-31 11:50:46 · 632 阅读 · 0 评论 -
Leetcode_189 Rotate Array
Rotate an array of n elements to the right by k steps.For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].#includevoid reverse(int *nums,int start,int原创 2015-05-31 14:45:11 · 762 阅读 · 0 评论 -
leetcode_001 two sum
题意分析:从数组中找出和为target的索引解题思路:1)双重循环,时间复杂度为O(n*n) 2)用hash表实现,时间复杂度为O(n)第一种方法实现双重循环求解vector twoSum1(vector &nums, int target){ vector result; int len = nums.size(); if (len原创 2016-02-22 19:45:19 · 977 阅读 · 0 评论 -
leetcode_060 Permutation Sequence
题意分析:1~n组成的序列从小到大排序,按顺序找出k个序列,并输出解题思路:对于数值n,排列组合共有n!种排列。第一位每个数组开头的序列有(n-1)个序列,共有n!个序列。依此类推,第二位每一个数开头有(n-2)!个序列。因数字不重复,故用sign标记数字是否使用过,data存阶层的数,每次循环找到没有使用的数中第k/data[i]个数就是当前位的数字。class Solution {原创 2016-03-26 21:05:55 · 372 阅读 · 0 评论 -
leetcode_062 Unique Paths
题意分析:给定一个m*n的二维方格,从方格的左上角开始走,每次只能向下或者向右走一步直到到方格的右下角结束,求总共有多少条不同的路径。解题思路:从左上角走到右下角,每次只能向下或者向右走一步,不管怎么走,都需要m + n - 2步才能走到,而这其中,有m - 1步向下走,n - 1步向右走,只用从这m + n - 2个位置中选择m - 1个位置,则剩余的位置表示向右走。其值为C(m-1, m+原创 2016-03-23 22:57:19 · 365 阅读 · 0 评论 -
leetcode_063 Unique Paths II
题意分析:此题与Unique Path是一样的,只是要单独考虑障碍物对整个棋盘的影响。解题思路:增加一个判断条件,如果有障碍物,此格填0,表示0个路径。初始条件受障碍物影响如下:1)假设整个棋盘只有一行,那么在第i个位置上设置一个障碍物后,说明位置i到最后一个格子这些路都没法走2)如果整个棋盘只有一列,那么在第i个位置上的障碍物,也会影响从第i位置往后的路。综上,在初始条件中,原创 2016-03-23 23:02:34 · 423 阅读 · 0 评论 -
leetcode_064 Minimun Path Sum
题目分析:找出一条从左上角到右下角的路,且这条路上的每个点的值相加和最小。解题思路:解法一:利用动态规划思想求解。 整个过程为: f[x][y] 从坐标点(0, 0)走到(x, y)的最短路径和; 规划方程为: f[x][y] = (x, y) + min{[f[x-1][y] + f[x][y-1]}; 初始条件为原创 2016-03-22 20:54:23 · 543 阅读 · 0 评论 -
leetcode_065 Valid Number
题目分析:判断一个数是否是合法数。解题分析:通过绘制有限状态自动机来实现。各个状态: 1)初始状态,无输入或者只有space的状态; 2)输入了数字之后的状态; 3)输入数字,然后输入小数点的状态; 4)输入数字,输入e的状态;原创 2016-03-22 21:12:59 · 459 阅读 · 0 评论 -
leetcode_069 Sqrt(x)
题目分析:求一个整数的平方根,如果此整数平方个不为整数,则返回其整数部分。解题思路:方法一:利用牛顿迭代法实现。 具体:迭代公式为:x(i+1) = (x(i) + n / x(i)) / 2。计算过程中利用递归即可。 方法二:利用折半查找实现。原创 2016-03-22 21:38:31 · 459 阅读 · 0 评论 -
leetcode_068 Text Justification
题目分析:输入一个字符串数组和一个规定长度原创 2016-03-23 22:09:23 · 446 阅读 · 0 评论 -
leetcode_072 Edit Distance
题目分析:将一个字符串变成另外一个字符串所用的最少操作数,每次只能增加、删除或者替换一个字符。解题思路: 设A[i-1][j-1]表示一个从长为i - 1的字符串str1变为长为j - 1的字符串str2的最短距离。str1转换为str2的过程主要涉及以下三种情况: 1)替换:将str1中的某个字符替换为str2中原创 2016-03-25 17:11:08 · 478 阅读 · 0 评论 -
leetcode_071 Simplify Path
题目分析:简化一个Unix文件路径,注意如下情况:1)“/."表示本级目录,可直接忽略2)“/..”表示返回上一级目录,若上一级目录存在,连通“/.."一并删除,否则只删除"/.."3)若去除冗余后路径为空,返回"/"4)若包含连续"/",删除多余的5)若路径不是单个"/",删除路径最后一个"/"原创 2016-03-25 17:19:23 · 417 阅读 · 0 评论 -
leetcode_073 Set Matrix Zeros
题目分析:对于一个给定的矩阵,如果它其中的某个元素为0,则将该元素所在行和列的值均变为0。解题思路: 1)创建一个两个数组,分别用于记录矩阵中的行和列是否需要变为0的标志; 2)遍历矩阵,标记矩阵中哪些行和哪些列元素需要变为0; 3)遍历矩阵,根据矩阵中对应行列是原创 2016-03-25 21:40:54 · 555 阅读 · 0 评论 -
leetcode_074 Search a 2D Matrix
题目分析:编写算法,实现从1个m*n的矩阵中查找给定的值。矩阵特点如下:每一行从左到右递增,每一列从上到下递增。解题思路: 解法一:遍历查找 从右上角开始遍历,每次遍历中,若与target相等,则返回true;若小于target,则向下移动一行,若大于target则向左移动一列,时间复杂度为O(原创 2016-03-25 22:39:14 · 373 阅读 · 0 评论 -
leetcode_075 Sort Colors
题目分析:给定一个数组,数组中的元素只可能为0,1,2,其中0代表红色,1代表白色,2代表蓝色。请按照红、白、蓝的顺序排好。不能使用排序算法实现。解题思路: 一遍扫描遍历数组,需要三个指针进行记录,具体如下: 1)从开始起第一个不确定为0的位置; 2)遍历指针所处的当前位置;原创 2016-03-26 19:07:47 · 513 阅读 · 0 评论 -
leetcode_076 Minimun Window Substring
题目分析:在字符串S中选一个长度最短的子串,使得子串包含所有的字母,要求时间复杂度为O(n),空间复杂度为O(1)。解题思路: 双指针实现,具体思想如下: 尾指针不断向后扫描,当遇到一个窗口包含了所有T的字符,则收缩头指针,一直到不能收缩头指针位置。 1)定义两个数组,分别用来统原创 2016-03-26 20:25:19 · 387 阅读 · 0 评论 -
leetcode_077 Combinations
题目分析:给定数字n和数字k,求从1~n中含有k个数所有可能组合数。解题思路: 递归回溯实现 1)递归一次,填入一个数字,填入的数字不能小于当前的值,防止重复; 2)回溯,弹出最后填入的那个数字,回溯到上一层;原创 2016-03-26 20:45:14 · 390 阅读 · 0 评论 -
leetcode_078 Subsets
题目分析:求一个集合的所以子集,包括空集合全集。解题思路: 递归回溯实现: 1)对集合中的数据进行排序,然后利用递归回溯的思想进行求解即可。 2)每次都对递归得到的子集进行保存即可,然后进一步递归即可。原创 2016-03-26 20:56:07 · 422 阅读 · 0 评论 -
leetcode_026 Remove Duplicates from Sorted Array
题目分析:给定一个有序序列,要求去除序列中的重复元素,得到一个序列,序列中每个元素只出现一次。要求禁止使用额外数组空间,只能使用静态空间。解题思路:一遍遍历实现使用双指针实现,一个指向当前遍历元素的位置,一个指向不重复元素应该存放的位置。进行一遍遍历指针即可实现。实现程序int removeDuplicates(int* nums, int numsSize) { if (nums原创 2016-03-27 22:37:38 · 401 阅读 · 0 评论 -
leetcode_080 Remove Duplicates from Sorted Array II
题目分析:在有序序列中,去除重复数,得到最后的序列,序列中每个数最多出现两次。要求禁止使用额外数组空间,只能使用静态空间。解题思路:一遍遍历实现使用双指针实现,一个指向当前遍历元素的位置,一个指向不重复出现两次元素应该存放的位置;定义两个变量,分别记录最终序列中即将保存的下一个元素值以及此元素出现的次数;当当前元素与即将存放的元素相等时,记录出现次数加1,否则,依据出现次数,正确向最终序列中填原创 2016-03-27 22:59:34 · 438 阅读 · 0 评论 -
leetcode_082 Remove Duplicates from Sorted List
题目分析:从有序的链表中,去除重复数,得到最后的链表,链表中每个元素最多出现一次。解题思路:快慢指针实现定义两个指针,一个快指针,一个慢指针,一遍遍历链表;判断快指针和慢指针中存放的值是否相等,相等则跳过快指针,且快指针向前移动;不相等则同时移动快慢指针即可。实现程序ListNode * deleteDuplicates(ListNode *head){ // 空链表或只有一个元素原创 2016-03-28 22:54:58 · 391 阅读 · 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 · 451 阅读 · 0 评论 -
leetcode_004 Median of Two Sorted Arrays
题目分析:求两个有序数组的中位数。要求时间复杂度为O(log(n+m)解题思路:方法一:合并排序实现1)将两个有序序列比分复制到同一个向量中2)对复制后的向量进行排序3)最后针对排序后的去中间的数输出即可。注意:此种方法虽然通过了,但是时间复杂度不是O(log(n+m))方法二:转换为找第k小的数,递归实现1)如果A或者B为空,直接返回B[k-1]或者A[k-1];2)如果k为1,返回A[0原创 2016-03-29 22:41:22 · 539 阅读 · 0 评论 -
leetcode_021 Merge Two Sorted Lists
题目分析:要求将两个排好序的list链表合并为一个有序的list链表。解题思路:遍历实现1)定义两个指针p、q、temp,分别指向两个排序需的链表和当前合并排序的链表;2)遍历两个链表,判断p和q指向单元值的大小,并将值小的节点挂接在temp上,然后向前移动该指针;3)最后判断对非空的链表直接挂接,返回合并链表的头结点即可。实现程序ListNode *mergeTwoLists(ListNo原创 2016-03-29 22:58:20 · 463 阅读 · 0 评论 -
leetcode_208 Implement Trie(Prefix Tree)
题目分析:实现字典树,包含其插入、查找以及前缀查找等方法。可以假设所有输入都只包含a-z字符。解题思路:字典树简介字典树(Trie Tree),又名前缀树,使一种用于快速检索的多叉树。主要用于字符串统计和查找等功能。字典树性质1)根节点不包括字符,除根节点外每个节点包含一个字符;2)从根节点到某一节点,路径上经过的字符串连接起来,为该节点对应的字符串;3)每个节点的所有子节点包含的字符都不相同原创 2016-03-30 22:49:56 · 541 阅读 · 0 评论 -
leetcode_023 Merge k Sorted Lists
题目分析:合并k个已经排好序的链表为一个有序链表。解题思路:递归实现利用递归思想,依次两两合并一个有序链表,直到合并为一个链表为止。实现程序//合并两个有序单链表ListNode *mergeTwoLists(ListNode *l1, ListNode *l2){ ListNode *head = (ListNode *)malloc(sizeof(ListNode));原创 2016-03-31 21:35:54 · 400 阅读 · 0 评论 -
二进制中1的个数统计
题目分析:统计一个整数对应的二进制数中1的个数。其中负数用补码表示。解题思路:两种方法实现方法1:判断最后一个是否为1,然后右移,继续统计(注意处理负数情况方法2:利用n&(n - 1)实现实现程序// 方法一实现:int NumberOf1(int n) { int count = 0; int i = 32; while(i) { i原创 2016-03-31 21:51:49 · 513 阅读 · 0 评论 -
leetcode_154 Find Minimum in Rotated Sorted Array II
题目分析:在递增的旋转数组中找到最小的数(数组中可能存在重复数)。解题思路:两种方法实现方法1:从后向前一遍遍历扫描实现方法2:利用二分查找实现。实现程序class Solution{ public: //从后向前扫描实现 int findMin1(vector<int> &nums) { if (nums.s原创 2016-03-31 22:00:00 · 395 阅读 · 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_081 Search in Rotated Sorted Array II
题目分析:在旋转后的有序数组中查找某个元素。(数组中存在重复元素)解题思路:两种方法实现方法1:遍历实现1)先判断要查找的数与数组头元素和数组尾元素大小,确定遍历方向;2)以一定的方向遍历查找,判断是否存在次元素。注意:遍历过程中若出现逆序情况,则说明不存在此元素。方法2:利用二分查找实现1)若target == A[mid],直接返回mid即可;有序情况下的处理如下:2)若A[first]原创 2016-03-31 22:43:30 · 333 阅读 · 0 评论 -
leetcode_088 Merge Sorted Array
题目分析:给定两个有序整型数组A和B,数组A的长度为m,数组B的长度为n,假设A能够放得下B。将两个数组合并为一个数组,放在A数组中。解题思路:两种方法实现遍历实现1)定义指向A和B数组(最大值)的指针i和j,同时定义指向合并后数组的最后一个位置的指针k;2)遍历进行判断A[i]与A[j]大小,将较大者放入A[k]中,然后调整指针,继续遍历,直到两个数组都遍历完为止。实现程序class So原创 2016-03-31 22:51:52 · 372 阅读 · 0 评论 -
leetcode_147 Insertion Sort List
题目分析:链表的插入排序实现。解题思路:两种方法实现遍历实现1)利用四个节点实现,其中一个节点指向当前带插入节点,一个节点指向带插入节点的下一个节点,一个节点记录待插入链表实际该插入位置的前一个元素,一个节点指向其带插入链表该插入位置的下一个节点;2)遍历链表,每次先记录当前带插入节点的下一个节点,然后从有序链表的表头开始遍历查找,当出现逆序时,将此节点插入即可。实现程序//对链表执行插入排原创 2016-03-31 23:02:47 · 761 阅读 · 0 评论 -
leetcode_108 Convert Sorted Array to Binary Search Tree
题目分析:给定一个升序数组,将其转换为一个高度平衡的二分查找树(BST)。解题思路:递归实现二叉查找树定义二叉查找树又称有序树,是一棵空树或者具有以下性质的二叉树:1)若任意节点的左子树不为空,则左子树上所有节点的值均小于它的根节点的值;2)若任意节点的右子树不为空,则右子树上所有节点的值均大于它的根节点的值;3)任意节点的左右子树也分别为二叉查找树。解题思路对有序区间[left, right原创 2016-04-01 22:27:23 · 399 阅读 · 0 评论 -
leetcode_108 Convert Sorted List to Binary Search Tree
题目分析:给定一个升序的单链表,将其转换为一个高度平衡的二分查找树(BST)。解题思路:递归实现二叉查找树定义二叉查找树又称有序树,是一棵空树或者具有以下性质的二叉树:1)若任意节点的左子树不为空,则左子树上所有节点的值均小于它的根节点的值;2)若任意节点的右子树不为空,则右子树上所有节点的值均大于它的根节点的值;3)任意节点的左右子树也分别为二叉查找树。方法一,借助数组实现将有序链表存放在一原创 2016-04-01 22:38:37 · 489 阅读 · 0 评论 -
leetcode_148 Sort List
题目分析:对链表进行排序,要求时间复杂度为O(nlogn),常量空间。解题思路: 归并排序实现基本思想:找到链表的中间节点,然后递归对前半部分和后半部分分别进行归并排序,然后将两个排好序的链表进行合并即可。注意:如果数组进行归并排序,则空间不为常量空间。实现程序//找链表的中间节点struct ListNode *getMidList(struct ListNode *head){原创 2016-04-01 23:03:51 · 414 阅读 · 0 评论 -
leetcode_010 Regular Expression Matching
题目分析:给定一个原字符串和一个正则表达式,判断其是否匹配解题思路: 递归实现基本思想:一个字符一个字符进行匹配,当遇到特殊字符如’*’和’.’时进行特殊处理。注意:如果数组进行归并排序,则空间不为常量空间。实现程序bool isMatch(char *s, char *p){ // 如果字符串p为空,则依据s是否为空返回最后结果 if(*p == '\0')原创 2016-04-02 22:39:22 · 453 阅读 · 0 评论 -
leetcode_094 Binary Tree Inorder Travelsal
题目分析:给定一棵二叉树,求中序遍历结果,要求利用非递归实现。解题思路: 递归实现1)递归遍历左子树;2)访问根节点;3)递归遍历右子树非递归实现利用栈实现,具体方法如下:1)将当前节点压栈,如果该节点存在左孩子,将左孩子压栈,然后看其是否有左孩子,存在则压栈,重复操作,不断将左孩子压入栈,直到不存在左孩子结束;2)弹出栈顶元素,判断其是否存在右孩子,存在压栈,并判断其是否存在左孩子,做原创 2016-04-04 15:55:50 · 643 阅读 · 0 评论 -
leetcode_102 Binary Tree Level Order Traversal
题目分析:二叉树层序遍历实现,要求输出每层的数据信息。解题思路: 递归实现。1)判断根节点是否问空,不为空,访问;2)递归访问当前节点的下一层左子树节点;3)递归访问当前节点的下一层右子树节点。非递归实现利用队列实现,具体方法如下:1)若树节点非空,则入队;2)出队,访问当前节点,并将其左右子节点(非空)分别入队;3)循环执行步骤2),直到队列为空即可。注意:需要一个变量记录每次节点的数原创 2016-04-04 21:51:36 · 422 阅读 · 0 评论 -
leetcode_107 Binary Tree Level Order Travelsal II
题目分析:二叉树层序遍历实现,要求输出每层的数据信息(从底层开始输出)。解题思路: 对比分析此题与102题基本思想相同,都是求树的层序遍历,唯一的不同是102是从根节点层开始输出,当此题是从叶节点层开始输出。实现方法基本一样,只需在最后对生成的序列进行逆转操作即可。递归实现1)判断根节点是否问空,不为空,访问;2)递归访问当前节点的下一层左子树节点;3)递归访问当前节点的下一层右子树节点原创 2016-04-04 21:58:26 · 583 阅读 · 0 评论 -
leetcode_103 Binary Tree Zigzag Level Order Traversal
题目分析:给定一棵二叉树,自顶向下,按照Z字形分层遍历。即如果本层是自左向右,则下一层是自右向左。解题思路: 分析此题本质函数二叉树的层次遍历,不同是输出每层信息存在方向。使用两个队列实现节点的分层访问。同时设置标志来决定每层节点输出方向。非递归实现利用队列实现,具体方法如下:1)若树节点非空,则入队1;2)定义队列2,队列1元素依次出队,并判断是否存在左右子节点,存在让其进入队列2,并原创 2016-04-05 23:06:52 · 377 阅读 · 0 评论