04 2020 档案

摘要:一:解题思路 Time:O(n),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: class Solution { public: int pivotIndex(vector<int>& nums) { if (nums.size() == 0) return -1; i 阅读全文
posted @ 2020-04-29 10:34 repinkply 阅读(135) 评论(0) 推荐(0)
摘要:一:解题思路 Time:O(n*log(n)),Space:O(1) 是一种不稳定的排序方法 二:完整代码示例 (C++版和Java版) C++: template <typename T> static void Swap(T& a,T& b) { T c(a); a=b; b=c; } temp 阅读全文
posted @ 2020-04-28 18:16 repinkply 阅读(137) 评论(0) 推荐(0)
摘要:一:解题思路 Time:O(n*log(n)),Space:O(n) 二:完整代码示例 (C++版和Java版) C++: template <typename T> static void Merge(T array[], T helper[], int begin,int mid,int end 阅读全文
posted @ 2020-04-28 17:20 repinkply 阅读(114) 评论(0) 推荐(0)
摘要:一:解题思路 Time:O(n^2/3),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: template <typename T> static void Shell(T array[],int len,bool min2max=true) { if(len==0) r 阅读全文
posted @ 2020-04-28 16:44 repinkply 阅读(146) 评论(0) 推荐(0)
摘要:一:解题思路 Time:O(n^2),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: template <typename T> static void Swap(T& a,T& b) { T c(a); a=b; b=c; } template <typename T> 阅读全文
posted @ 2020-04-28 16:33 repinkply 阅读(142) 评论(0) 推荐(0)
摘要:一:解题思路 Time:O(n^2),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: template <typename T> static void Insert(T array[],int len,bool min2max=true) { if(len==0) re 阅读全文
posted @ 2020-04-28 12:18 repinkply 阅读(121) 评论(0) 推荐(0)
摘要:一:解题思路 Time:O(n^2),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: template <typename T> static void Swap(T& a,T& b) { T c(a); a=b; b=c; } template <typename T> 阅读全文
posted @ 2020-04-28 12:08 repinkply 阅读(145) 评论(0) 推荐(0)
摘要:一:解题思路 用2个队列实现栈 二:完整代码示例 (C++、Java、Python) C++: class MyStack { private: queue<int> m_queueIn; queue<int> m_queueOut; queue<int>* m_pIn; queue<int>* m 阅读全文
posted @ 2020-04-27 21:02 repinkply 阅读(152) 评论(0) 推荐(0)
摘要:一:解题思路 采用二分搜索的思想来做这道题目。Time:O(log(n)),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: class Solution { public: int firstBadVersion(int n) { int low = 1; int hig 阅读全文
posted @ 2020-04-21 10:55 repinkply 阅读(159) 评论(0) 推荐(0)
摘要:一:解题思路 这个题目是二分搜索的一个变体。Time:log(n),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: class Solution { public: int findMin(vector<int>& nums) { int low = 0; int hig 阅读全文
posted @ 2020-04-20 12:44 repinkply 阅读(123) 评论(0) 推荐(0)
摘要:一:解题思路 之前做过一些求第K小或者第K大的元素的题目。一旦题目需要你求第K小或者第K大的元素的时候,这个时候就需要想到堆这个数据结构。 方法一:使用一个最大堆来做。当堆中的元素不足K个的时候,我们就不断的将矩阵中的元素加入堆中。然后接着遍历矩阵后面的其他元素,当遍历的元素小于堆顶元素的时候,加入 阅读全文
posted @ 2020-04-19 22:12 repinkply 阅读(282) 评论(0) 推荐(0)
摘要:一:解题思路 方法一:每次添加一个数字,都使它成为一个递增有序的序列。时间复杂度分别为:addNum:O(n),findMedian:O(1) 方法二:采用一个最小堆和一个最大堆。时间复杂度分别为:addNum:O(log(n)),findMedian:O(1) 二:完整代码示例 (C++版和Jav 阅读全文
posted @ 2020-04-19 19:18 repinkply 阅读(198) 评论(0) 推荐(0)
摘要:一:解题思路 二:完整代码示例 (C++版和Java版) C++: class RandomizedSet { private: map<int, int> m_map; vector<int> m_data; public: /** Initialize your data structure h 阅读全文
posted @ 2020-04-18 22:04 repinkply 阅读(140) 评论(0) 推荐(0)
摘要:一:解题思路 如果x>y,那么一定可以用randx去实现randy。其中,randx表示等概率的生成1到x的函数。randy表示等概率的生成1到y的函数。 二:完整代码示例 (C++版和Java版) C++: class Solution { public: int rand10() { int x 阅读全文
posted @ 2020-04-18 20:44 repinkply 阅读(203) 评论(0) 推荐(0)
摘要:一:解题思路 Time:O(n^3/2),Space:O(n) 二:完整代码示例 (C++版和Java版) C++: class Solution { public: int numSquares(int n) { vector<int> d(n+1); d[0] = 0; for (int i = 阅读全文
posted @ 2020-04-18 17:07 repinkply 阅读(161) 评论(0) 推荐(0)
摘要:一:解题思路 方法一:递归法 Time:O(n),Space:O(n) 方法二:迭代法 Time:O(n),Space:O(n) 二:完整代码示例 (C++版和Java版) 方法一C++: class Solution { public: int rangeSumBST(TreeNode* root 阅读全文
posted @ 2020-04-18 12:09 repinkply 阅读(176) 评论(0) 推荐(0)
摘要:一:解题思路 Time:O(n),Space:O(n) 二:完整代码示例 (C++版和Java版) C++: class Solution { public: vector<vector<int>> zigzagLevelOrder(TreeNode* root) { vector<vector<i 阅读全文
posted @ 2020-04-17 22:35 repinkply 阅读(641) 评论(0) 推荐(0)
摘要:一:解题思路 方法一递归法:Time:O(2^n),Space:O(n) 方法二迭代法:Time:O(n*2^n),Space:O(1) 二:完整代码示例 (C++版和Java版) 方法一C++: class Solution { private: void sub(vector<int>& num 阅读全文
posted @ 2020-04-17 17:52 repinkply 阅读(187) 评论(0) 推荐(0)
摘要:一:解题思路 先按照主对角线进行反转,然后列对称进行反转。 如果这个题目改为,将图像逆时针旋转90度。那么解题方法与上面类似,先按主对角线进行反转,然后按照行对称进行反转。 Time:O(n^2),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: class Solutio 阅读全文
posted @ 2020-04-16 20:33 repinkply 阅读(180) 评论(0) 推荐(0)
摘要:一:解题思路 Time:O(n^3),Space:O(1) 和之前做的 相加等于0的三个数 这道题目是一样的。 二:完整代码示例 (C++版和Java版) C++: class Solution { public: vector<vector<int>> fourSum(vector<int>& n 阅读全文
posted @ 2020-04-16 20:03 repinkply 阅读(178) 评论(0) 推荐(0)
摘要:一:解题思路 Time:O(n^2),Sapce:O(1) 之前做过一道求3个数的和等于0的组合,解题方法与这个题目几乎一样。 二:完整代码示例 (C++版和Java版) C++: class Solution { public: int threeSumClosest(vector<int>& n 阅读全文
posted @ 2020-04-16 19:25 repinkply 阅读(218) 评论(0) 推荐(0)
摘要:一:解题思路 这个题目有没什么技巧而言,就是以一个字母为中心,递归的进行上下左右进行对比。 Time: O(m*n*3^k), Space: O(m*n) 有点奇怪的是,在leetcode上,同样的程序,Java代码可以通过,但是C++的代码不能通过。但是在lintcode上可以完美通过!,说明le 阅读全文
posted @ 2020-04-16 17:45 repinkply 阅读(194) 评论(0) 推荐(0)
摘要:一:解题思路 用快慢指针法来解决这道题,效率是最高的。从下标为0开始,以每次下标开始读数组,肯定会形成一个圆环。此时,用快慢指针从头部开始走,最终快慢指针肯定会相遇在某个地方。此时,再用另外一个指针指向头部,和慢指针一次走一步,最终他们会相遇到圆环的开始节点。 Time:O(n),Space:O(1 阅读全文
posted @ 2020-04-16 16:34 repinkply 阅读(99) 评论(0) 推荐(0)
摘要:一:解题思路 方法一:递归法 Time:O(n),Space:O(n) 方法二:迭代法 Time:O(n),Space:O(1) 二:完整代码示例 (C++、Java、Python) 方法一C++: class Solution { public: ListNode* swapPairs(ListN 阅读全文
posted @ 2020-04-15 21:14 repinkply 阅读(134) 评论(0) 推荐(0)
摘要:一:解题思路 采用二分搜索的思想来做。 Time:O(log(n)),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: class Solution { public: int findPeakElement(vector<int>& nums) { if (nums.si 阅读全文
posted @ 2020-04-15 20:31 repinkply 阅读(506) 评论(0) 推荐(0)
摘要:一:解题思路 Time:O(n),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: class Solution { public: ListNode* oddEvenList(ListNode* head) { if (head == NULL || head->next 阅读全文
posted @ 2020-04-15 18:29 repinkply 阅读(118) 评论(0) 推荐(0)
摘要:一:解题思路 Time:O(n^(target/min)),Space:O(target/min) ,其中n为数组长度,min是数组中的最小值。 如果把这个题目稍微修改一下,定义数组中每个下标的元素的为不同的元素,而且数组中可以包含重复的元素,那么最后的结果为多少? 二:完整代码示例 (C++版和J 阅读全文
posted @ 2020-04-15 17:17 repinkply 阅读(179) 评论(0) 推荐(0)
摘要:一:解题思路 方法一:Time:O(n),Space:O(n) 方法二:Time:O(n),Space:O(1) 二:完整代码示例 (C++版和Java版) 方法一C++: class Solution { public: int jump(vector<int>& nums) { if (nums 阅读全文
posted @ 2020-04-15 16:41 repinkply 阅读(190) 评论(0) 推荐(0)
摘要:一:解题思路 Time:O(n),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: class Solution { public: ListNode* partition(ListNode* head, int x) { if (head == NULL) return 阅读全文
posted @ 2020-04-15 15:47 repinkply 阅读(148) 评论(0) 推荐(0)
摘要:一:解题思路 add:Time:O(1),find,Time:O(n) 二:完整代码示例 (C++版和Java版) C++: class TwoSum { private: vector<int> data; public: void add(int number) { data.push_back 阅读全文
posted @ 2020-04-15 11:46 repinkply 阅读(122) 评论(0) 推荐(0)
摘要:一:解题思路 一:这个题目是将链表右边的结点循环移动到链表的左边来。 1.将链表首位相连,移动次数为K,K=K%N (N为链表的长度)。 2.然后,再找新的链表的结束尾结点时,需要从链表头部走N-K-1步,即可以找到链表的新的尾部结点。 二:如果将这个题目改编一下,将链表左边的结点循环移动到链表的右 阅读全文
posted @ 2020-04-14 21:11 repinkply 阅读(150) 评论(0) 推荐(0)
摘要:一:解题思路 Time:O(n),Space:O(1) maxValue为最远可以跳到的距离。 1.如果当前的可以跳到的最远距离已经到底了末尾,或者已经超过末尾的,直接返回true。 2.如果当前下标已经超过最远可以到达的距离,直接返回false。 3.不断更新最远可以跳到的距离。 二:完整代码示例 阅读全文
posted @ 2020-04-14 20:47 repinkply 阅读(147) 评论(0) 推荐(0)
摘要:一:解题思路 定义三个游标,p2,p3,p5,分别指向用来乘以2,3,5中的数组元素,然后取其最小值,加入到丑数数组中来。 Time:O(n),Space:O(n) 二:完整代码示例 (C++版和Java版) C++: class Solution { private: int min3(int a 阅读全文
posted @ 2020-04-14 20:25 repinkply 阅读(166) 评论(0) 推荐(0)
摘要:一:解题思路 比如给我们的数组为:218421,那么下一个全排列为:221148。记住这个例子,根据这个例子来做这个题目。 Time:O(n),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: class Solution { public: void nextPermut 阅读全文
posted @ 2020-04-14 18:10 repinkply 阅读(157) 评论(0) 推荐(0)
摘要:一:解题思路 Time:O(n*log(n)),Space:O(log(n)) 和之前做过的合拼K个链表的第二种方法有点类似,采用归并的思想来做。就是不断的把链表切半,然后递归的处理这2条链表。然后再将这2条排序好的链表合并起来就行。 二:完整代码示例 (C++版和Java版) C++: class 阅读全文
posted @ 2020-04-14 17:27 repinkply 阅读(136) 评论(0) 推荐(0)
摘要:一:解题思路 方法一:之前做过一道合并2个链表的题目,那么第一种方法就是将数组中的链表两两合并,得到最后的结果。Time:O(k*n),Space:O(1) 方法二:采用分治法,两两合拼。不断递归,最后只剩下一个链表。Time:O(n*log(k)),Space:O(log(k)) 二:完整代码示例 阅读全文
posted @ 2020-04-13 21:47 repinkply 阅读(187) 评论(0) 推荐(0)
摘要:一:解题思路 方法一:使用一个辅助集合。Time:O(n),Space:O(n) 方法二:快慢指针法。Time:O(n),Space:O(1) 二:完整代码示例 (C++版和Java版) 方法一C++: class Solution { public: ListNode *detectCycle(L 阅读全文
posted @ 2020-04-13 20:38 repinkply 阅读(203) 评论(0) 推荐(0)
摘要:一:解题思路 解题的关键之处在于:对于一个已经递增排序好的数组,从左往右本来就是递增的,从右往左本来就是递减的。我们只需要找到第一次不满足这2个条件的下标 i和j,然后基于这两个下标 i和j,分别向两边扩展,确定最短长度。 记住这个例子:02418 方法一:Time:O(n*log(n)),Spac 阅读全文
posted @ 2020-04-13 17:53 repinkply 阅读(124) 评论(0) 推荐(0)
摘要:一:解题思路 Time:O(h),Space:O(h),h为树的高度 二:完整代码示例 (C++版和Java版) C++: class Solution { public: TreeNode* deleteNode(TreeNode* root, int key) { if (root == NUL 阅读全文
posted @ 2020-04-13 16:44 repinkply 阅读(145) 评论(0) 推荐(0)
摘要:一:解题思路 这个题目是二分搜索的一道变形题目。比较关键的一点是,需要判断mid是落在左边的子数组上,还是落在右边的子数组上。 Time:O(log(n)),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: class Solution { public: int sear 阅读全文
posted @ 2020-04-13 15:55 repinkply 阅读(158) 评论(0) 推荐(0)
摘要:一:解题思路 Time:O(log(n)),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: class Solution { private: int binarySearchLastOne(vector<int>& nums, int target) { int low 阅读全文
posted @ 2020-04-13 13:09 repinkply 阅读(238) 评论(0) 推荐(0)
摘要:一:解题思路 方法一:采用计数排序的思想来做,Time:O(n),Space:O(1) 方法二:只需要遍历一遍数组,Time:O(n),Space:O(1) 二:完整代码示例 (C++版和Java版) 方法一C++: class Solution { public: void sortColors( 阅读全文
posted @ 2020-04-12 22:13 repinkply 阅读(280) 评论(0) 推荐(0)
摘要:一:解题思路 方法一:用动态规划的思想来做。Time:O(n^2),Space:O(n) 方法二:采用二分搜索的思想来做。Time:O(n*log(n)),Space:O(n) 二:完整代码示例 (C++版和Java版) 方法一C++: class Solution { public: int le 阅读全文
posted @ 2020-04-12 16:54 repinkply 阅读(205) 评论(0) 推荐(0)
摘要:一:解题思路 方法一:Time:O(m*n),Space:O(m*n) 方法二:Time:O(m*n),Space:O(1) 二:完整代码示例 (C++版和Java版) 方法一C++: class Solution { public: int uniquePathsWithObstacles(vec 阅读全文
posted @ 2020-04-12 13:05 repinkply 阅读(239) 评论(0) 推荐(0)
摘要:一:解题思路 这个题目的本质就是判断AA字符串中是否包含B字符串。如果语言内置的函数中直接内置函数有字符串包含可以直接使用。 len(A)==len(B) && AA.contains(B) (strstr(AA,B)) Time:O(n^2),Space:O(1) 二:完整代码示例 (C++版和J 阅读全文
posted @ 2020-04-11 22:32 repinkply 阅读(184) 评论(0) 推荐(0)
摘要:一:解题思路 方法一:利用动态规划的思想来做,用一个二维数组d[m][n]来表示每个格子的路径数量。对于第一行:d[0][j]=1。对于第一列:d[i][0]=1。对于其他位置的路径数量。d[i][j]=d[i-1][j]+d[i][j-1]。Time:O(m*n),Space:O(m*n) 方法二 阅读全文
posted @ 2020-04-11 17:36 repinkply 阅读(207) 评论(0) 推荐(0)
摘要:一:解题思路 之前做过一道题目,求连续子序列的最大和。Time:O(n),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: class Solution { private: int max3(int a, int b, int c) { return max(max(a, 阅读全文
posted @ 2020-04-10 21:54 repinkply 阅读(239) 评论(0) 推荐(0)
摘要:一:解题思路 之前做过一道题目p45,就是除掉了首尾相接的条件。那么这个题目的本质用的方法可以和p45一样,只不过要分2次抢而已。第一次抢首位的,不强末尾的,第二次不抢末尾的,要抢首位的。然后取2者中的较大值即可。Time:O(n),Space:O(1) 二:完整代码示例 (C++版和Java版) 阅读全文
posted @ 2020-04-10 16:33 repinkply 阅读(153) 评论(0) 推荐(0)
摘要:一:解题思路 Time:O(n),Space:O(n) 二:完整代码示例 (C++版和Java版) C++: class Solution { private: TreeNode* buildTree(vector<int>& postorder, int postStart, int postEn 阅读全文
posted @ 2020-04-10 15:46 repinkply 阅读(163) 评论(0) 推荐(0)
摘要:一:解题思路 Time:O(n),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: class Solution { public: ListNode* deleteDuplicates(ListNode* head) { ListNode* dummy = new Lis 阅读全文
posted @ 2020-04-08 21:56 repinkply 阅读(181) 评论(0) 推荐(0)
摘要:一:解题思路 利用一个辅助哈希表来存储,中序遍历的元素和对于的下标。Time:O(n),Space:O(n) 二:完整代码示例 (C++版和Java版) C++: class Solution { private: TreeNode* buildTree(vector<int>& preorder, 阅读全文
posted @ 2020-04-08 21:25 repinkply 阅读(122) 评论(0) 推荐(0)
摘要:一:解题思路 这道题的最简单的做法是,将数组从大到小进行排序,然后取出第k-1的那个元素。Time:O(n*log(n)),Space:O(1) 我们来写下面2种做法。 方法一:我们来维护一个top k的最小堆,遍历一次数组,将数组中的元素加入数组中,最后堆定元素就是第K大的元素。Time:O(n* 阅读全文
posted @ 2020-04-08 20:40 repinkply 阅读(157) 评论(0) 推荐(0)
摘要:一:解题思路 二:完整代码示例 (C++版和Java版) C++: class Solution { private: vector<int> nums; vector<int> orignalNums; public: Solution(vector<int>& nums) { this->num 阅读全文
posted @ 2020-04-08 17:55 repinkply 阅读(128) 评论(0) 推荐(0)
摘要:一:解题思路 在C++和Java中,使用最小堆或者最大堆,用一个优先队列即可。构造函数:Time:O(n*log(k)),添加函数:Time:O(log(k)) 二:完整代码示例 (C++、Java、Python) C++: class KthLargest { private: priority_ 阅读全文
posted @ 2020-04-08 16:51 repinkply 阅读(162) 评论(0) 推荐(0)
摘要:一:解题思路 这个题目如果采用之前单身数字那个题目的方法来做,时间复杂度为O(n)。但题目的要求是O(log(n)),所以不能采用哪种方法。 这个题目可以采用二分搜索的思想来做,对于数组中的任意一个数字,1.要么等于它左边的数字,2.要么等于它右边的数字,3.要么即不等于左边的数字,又不等于它右边的 阅读全文
posted @ 2020-04-08 16:04 repinkply 阅读(143) 评论(0) 推荐(0)
摘要:一:解题思路 方法一:暴力破解法 Time:O(n^3),Space:(1) 方法二:利用双指针法可以优化时间复杂度,Time:O(n^2),Space:O(1) 二:完整代码示例 (C、C++、Java、Python) 方法一C: 方法二C: 方法一C++: class Solution { pu 阅读全文
posted @ 2020-04-07 21:10 repinkply 阅读(476) 评论(0) 推荐(0)
摘要:一:解题思路 注意如果n大于链表长度,说明要删除的节点不在链表中,直接返回原始链表就行。Time:O(k),Space:O(1),k为链表长度 二:完整代码示例 (C++版和Java版) C++: class Solution { public: ListNode* removeNthFromEnd 阅读全文
posted @ 2020-04-07 20:29 repinkply 阅读(114) 评论(0) 推荐(0)
摘要:一:解题思路 这是一道经典的动态规划的题目。 方法一:定义初始转态和转态转移方程。 d[0][0]=a[0][0];对于一行:d[0][j]=d[0][j-1]+a[0][j]; 对于第一列:d[i][0]=d[i-1][0]+a[i][0]; 除了第一行和第一列之外的其他元素:d[i][j]=mi 阅读全文
posted @ 2020-04-07 20:10 repinkply 阅读(177) 评论(0) 推荐(0)
摘要:一:解题思路 一种比较容易想到的解法是定义2个记录行和列的数组,先遍历一遍原始的数组,如果出现了0,这记录到行列数组为true。然后再遍历一遍数组,如果在行列数组中标记为true了,则将所在的行列全部置0.这种方法用了2个额外的数组,空间复杂度不够低。另外一种方法可以将空间复杂度变为O(1)。Tim 阅读全文
posted @ 2020-04-07 17:41 repinkply 阅读(153) 评论(0) 推荐(0)
摘要:一:解题思路 确定根节点的上下界进行不断的传递下去进行判断是否为二叉搜索树。Time:O(n),Space:O(n) 二:完整代码示例 (C++版和Java版) C++: class Solution { private: bool isValidBST(TreeNode* root, TreeNo 阅读全文
posted @ 2020-04-07 16:38 repinkply 阅读(149) 评论(0) 推荐(0)
摘要:一:解题思路 这个题目和之前做过一道杨辉三角题目很类似,那个题目是要你求出所有的行数,而这个题目是需要你求出第几行。最优解:Time:O(n^2),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: class Solution { public: vector<int> g 阅读全文
posted @ 2020-04-07 15:48 repinkply 阅读(146) 评论(0) 推荐(0)
摘要:一:解题思路 这个题目没有太多复杂的算法,只是考虑以及考察的边界条件较多。 1.可以有前导空格或前导0,但不能有其他前导字符。 2.可能会有一个加号或减号表示正负,也可能没有,连续的多个加号或者减号则视为不合法。 3.紧接着是一段连续的数字,如果没有数字则视为不合法。 4.数字后的其他字符都可以忽略 阅读全文
posted @ 2020-04-06 21:53 repinkply 阅读(241) 评论(0) 推荐(0)
摘要:一:解题思路 这个题目是二分搜索的一个变形题目。这个题目的解题关键在于将二维数组看做成一维数组,然后利用二分的思想不断的进行更新。matrix[r][c],r=mid/n,c=mid%n。其中n为数组的列数。Time:O(log(m*n)),Space:O(1) 二:完整代码示例 (C++版和Jav 阅读全文
posted @ 2020-04-06 17:47 repinkply 阅读(133) 评论(0) 推荐(0)
摘要:一:解题思路 方法一:暴力破解,Space:O(n^2),Space:O(1),这种方法时间复杂度太大,容易引起超时。 方法二:双指针,Time:O(n),Space:O(1) 二:完整代码示例 (C、C++、Java、Python) 方法一C: int max(int a, int b) { re 阅读全文
posted @ 2020-04-06 17:12 repinkply 阅读(227) 评论(0) 推荐(0)
摘要:一:解题思路 这个题目的解题关键有2点:1.任何时候写下左括号都是合法的。2.只有写下的左括号多于右括号的时候,再写下右括号才合法。 Time:O(4^n/n*sqrt(n)),Space:O(n) 二:完整代码示例 (C++版和Java版) C++: class Solution { public 阅读全文
posted @ 2020-04-06 16:13 repinkply 阅读(201) 评论(0) 推荐(0)
摘要:一:解题思路 方法一:Time:O(n^2),Space:O(1) 方法二:Time:O(n^2),Space:O(1) 相同的Java程序改到C++却不能运行有点奇怪!还是把程序贴上。原因可能之后会想出来! 二:完整代码示例 (C++版和Java版) C++: 方法一: class Solutio 阅读全文
posted @ 2020-04-06 15:21 repinkply 阅读(168) 评论(0) 推荐(0)
摘要:一:解题思路 方法一:Time:O(n),Space:O(1),方法一比方法二容易理解,推荐用方法一 方法二:Time:O(n),Space:O(1) 二:完整代码示例 (C++版和Java版) 方法一C++: class Solution { public: int lengthOfLongest 阅读全文
posted @ 2020-04-05 21:44 repinkply 阅读(158) 评论(0) 推荐(0)
摘要:一:解题思路 定义2个栈,一个栈st,另外一个栈min专门用来保存st栈的最小值。这样就可以在常数时间内检索到最小元素。 二:完整代码示例 (C++版和Java版) 方法一C++: class MinStack { public: stack<int> st; stack<int> min; Min 阅读全文
posted @ 2020-04-05 20:37 repinkply 阅读(176) 评论(0) 推荐(0)
摘要:一:解题思路 方法一:判断S(i,j)是否回文。1.当i==j的时候,只有一个字符,肯定是回文。2.当i+1==j的时候,只需要判断S(i)==S(j),就可以知道S(i,j)是否回文。3.i+1!=j的时候,需要判断 S(i)==S(j) && S(i+1,j-1)。因此不仅需要判断S(i)==S 阅读全文
posted @ 2020-04-05 17:11 repinkply 阅读(205) 评论(0) 推荐(0)
摘要:一:解题思路 Time:O(n),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: class Solution { public: int removeElement(vector<int>& nums, int val) { if (nums.size() == 0) 阅读全文
posted @ 2020-04-05 16:22 repinkply 阅读(168) 评论(0) 推荐(0)
摘要:一:解题思路 这道题目看起来比较简单,只需要将数组对应的从i到j的下标中的元素累加就行。但题目说了,会多次调用这个函数。是不是有更高效的做这个题目的方法呢?当然有,我们可以用一个简单的公式来计算一下。我们定义S(i)为从0到i-1的和,S(j)定义为从0到j-1的和,那么f(i,j)=S(j+1)- 阅读全文
posted @ 2020-04-05 15:59 repinkply 阅读(161) 评论(0) 推荐(0)
摘要:一:解题思路 这个题目和上一道二进制求和题目类似。Time:O(max(m,n)),Space:O(n) 二:完整代码示例 (C++版和Java版) C++: class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNod 阅读全文
posted @ 2020-04-04 21:45 repinkply 阅读(157) 评论(0) 推荐(0)
摘要:一:解题思路 Time:O(max(m,n)),Space:O(max(m,n)) 二:完整代码示例 (C++版和Java版) C++: class Solution { public: string addBinary(string a, string b) { int i = a.length( 阅读全文
posted @ 2020-04-04 21:20 repinkply 阅读(154) 评论(0) 推荐(0)
摘要:一:解题思路 方法一:先对2个字符串进行排序,然后逐一比较他们中的每一个元素,如果不等则返回false。Time:O(n*log(n)), Java中空间复杂度为:Space:O(n),C++中空间复杂度为:O(1) 方法二:申请一个大小为26的整形数组,s数组统计字母出现的次数,t数组抵消字母出现 阅读全文
posted @ 2020-04-04 20:27 repinkply 阅读(150) 评论(0) 推荐(0)
摘要:一:解题思路 依次从低到高取出n中的每一二进制位,进行操作。res初始化为0,res=(n&1)|(res<<1);n=n>>1,然后循环32次。无论n取什么值,都只需要操作32次就可以得到最后结果,所以Time:O(1),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: 阅读全文
posted @ 2020-04-04 18:13 repinkply 阅读(129) 评论(0) 推荐(0)
摘要:一:解题思路 首先很容易想到的一种方法是,暴力破解法,用2层循环去除数组中所有的数字对,然后进行一一比较,这种的时间复杂度为O(n^2)太高了,就不写它的代码了。 方法一:先对数组进行排序,然后从数组下标为1的开始,与前一个进行对比,直到遍历完数组。Time:(O(n*log(n))),Space: 阅读全文
posted @ 2020-04-04 17:44 repinkply 阅读(158) 评论(0) 推荐(0)
摘要:一:解题思路 列表题是一个26进制数表示的字符串,其中1到26用A到Z表示。而这个题目的本质就是,让我们把这个26进制数转化为一个10进制数。 1.设置一个base=1,字符串从右向左进行遍历,将当前字母表示的数字乘以base,加入到最后的结果num中,然后将base*26。Time:O(n),Sp 阅读全文
posted @ 2020-04-04 17:19 repinkply 阅读(135) 评论(0) 推荐(0)
摘要:一:解题思路 采用一个虚拟的头节点maybe,同时用另外一个节点notNine指向maybe。然后考虑的情况和上道题数组加一基本上是一样的。Time:O(n),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: class Solution { public: ListNod 阅读全文
posted @ 2020-04-04 16:58 repinkply 阅读(143) 评论(0) 推荐(0)
摘要:一:解题思路 解析:一般情况,只需要将最后一位数字加1,然后返回即可。题目以及告诉我们数组非空,所以我们不用判断边界条件。Time:O(n),Space:O(1) 1.如果最后一位数字是9,我们就要产生进位。即把最后一位数字置为0,将前一位数字加1即可。 2.如果数组上的数字全部是9,那么这个时候就 阅读全文
posted @ 2020-04-04 12:13 repinkply 阅读(142) 评论(0) 推荐(0)
摘要:一:解题思路 方法一:可以采用前面讲解的类似的2的幂来做这道题,Time:O(log_3(n)),Space:O(1) 方法二:整数最大值,y=2^31-1。3^a<=y,那么a<=log_ay ==> a<=ln(y)/ln(3),计算出a为19.所以MAX_NUM=3^19。Time:O(1), 阅读全文
posted @ 2020-04-03 21:00 repinkply 阅读(136) 评论(0) 推荐(0)
摘要:一:解题思路 方法一:只要原始数字为2的倍数,不断的去除以2,直到最后结果为1.Time:O(log(n)),Space:O(1) 方法二:我们可以发现,当一个数中有且仅有某一位二进制为1的时候,那么这个数就肯定是2的幂。所以我们可以看n&(n-1)==0来判断这个数是否为2的幂。Time:O(1) 阅读全文
posted @ 2020-04-03 20:31 repinkply 阅读(593) 评论(0) 推荐(0)
摘要:一:解题思路 Time:O(1.3^n)或O(2^n) Space:O(1.3^n)或O(2^n) 二:完整代码示例 (C++版和Java版) C++: class Solution { public: string countAndSay(int n) { if (n < 1) return "" 阅读全文
posted @ 2020-04-03 19:59 repinkply 阅读(186) 评论(0) 推荐(0)
摘要:一:解题思路 这个题的本质和之前做过的单链表是否有环差不多。 方法一:利用一个集合set不断的变化数字,并将数字加入到集合set中,如果发现变换的数字最终为1则返回true,如果发现集合中以及存在之前变换的数字,则返回false。Time:O(1),Space:O(1) 方法二:快慢指针法,快指针每 阅读全文
posted @ 2020-04-03 16:58 repinkply 阅读(376) 评论(0) 推荐(0)
摘要:一:解题思路 Time:O(log_5(n)),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: class Solution { public: int trailingZeroes(int n) { int count = 0; while (n > 0) { n /= 阅读全文
posted @ 2020-04-03 16:10 repinkply 阅读(127) 评论(0) 推荐(0)
摘要:一:解题思路 二:完整代码示例 (C++版和Java版) C++11方法一:Time:O(m+n),Space:O(m) class Solution { public: vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { 阅读全文
posted @ 2020-04-02 21:28 repinkply 阅读(141) 评论(0) 推荐(0)
摘要:一:解题思路 我们之前做个一道题,在一个有序数组中,求和为定值的两个数。当时是采用类似二分搜索的方法来做的。同样这道题目也可以采用类似的方法来做,让两个游标i=0,j=(int)根号c,然后利用二分的思想来做。 二:完整代码示例 (C++版和Java版) C++: class Solution { 阅读全文
posted @ 2020-04-02 18:07 repinkply 阅读(255) 评论(0) 推荐(0)
摘要:一:解题思路 1.如果当前的罗马数字是字符串中最后一个字符,或者当前的罗马数字大于等于它右边的罗马数字,那么就加上当前的罗马数字对应的数值。 2.如果当前的罗马数字小于它右边的罗马数字,那么就减去当前的罗马数字对应的数值。 在这里需要一个数组来存储7个罗马数字和阿拉伯数字之间的转换,但不管在任何情况 阅读全文
posted @ 2020-04-02 17:16 repinkply 阅读(152) 评论(0) 推荐(0)
摘要:第一点:我们知道分配器在STL中扮演的是幕后英雄,一般感觉上分配器扮演的是内存池的角色,但事实情况真的是这样吗? (内存池的工作原理:我们知道C++中new关键字进行动态内存分配的时候,其底层做的事情还是调用malloc函数,那么每次调用malloc其实系统会为我们多分配一些内存空间出来的,多分配的 阅读全文
posted @ 2020-04-02 13:11 repinkply 阅读(22) 评论(0) 推荐(0)