algorithm learning
crazy_jiang
这个作者很懒,什么都没留下…
展开
-
算法的时间复杂度和空间复杂度分析
一 算法的时间复杂度分析 (1)时间频度一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。(2)原创 2016-05-10 17:08:38 · 4259 阅读 · 0 评论 -
二叉搜索树的递归遍历和非递归遍历
递归遍历 void preOrder(TreeNode *root){ if(!root) return; cout << root->val << endl; preOrder(root->left); preOrder(root->right);} void inOrder(TreeNode *root){ if(!root) return原创 2017-03-26 16:58:31 · 565 阅读 · 0 评论 -
常用排序算法总结
常用排序算法:冒泡 选择 直接插入 二分插入 希尔排序 快速排序 归并排序 堆排序 算法的时间复杂度和空间复杂度就不分析了,自行百度,代码如下: #include<iostream>#include<string>using namespace std;void bubble_sort1(int arr[], int len){ for(int i = 0; i < len-1;原创 2017-03-26 17:05:51 · 562 阅读 · 0 评论 -
113. Path Sum II
使用递归的方法,传递path变量,sum减去经过path经过节点的值,最后为0,且为根节点即可。class Solution {public: vector<vector<int>> pathSum(TreeNode* root, int sum) { vector<int> path; vector<vector<int>> allPath;原创 2016-12-20 23:02:15 · 223 阅读 · 0 评论 -
110. Balanced Binary Tree
二叉平衡树的判断,使用递归的方法 class Solution {public: bool isBalanced(TreeNode* root) { return findDepth(root) == -1 ? false : true; } int findDepth(TreeNode* root) { if(!root) ret原创 2016-12-20 22:54:14 · 206 阅读 · 0 评论 -
115. Distinct Subsequences
用二维动态规划解决,代码如下 public class Solution { public int numDistinct(String s, String t) { int[][] dp = new int[t.length()+1][s.length()+1]; dp[0][0] = 1; for(int i = 1; i <= t原创 2016-12-20 22:52:26 · 169 阅读 · 0 评论 -
Reorder List(链表重排序)
leetcode 143. Reorder ListGiven a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…You must do this in-place without altering the nodes’ values.For example, Given {1,2,3,4原创 2016-12-05 11:43:52 · 409 阅读 · 0 评论 -
128. Longest Consecutive Sequence
第一种方法是利用set,然后以每个元素为中心,向两边扩散计算最长的连续子序列。算法复杂度为O(n) class Solution {public:int longestConsecutive(vector<int>& nums) { int res = 0; unordered_set<int> s(nums.begin(), nums.end()); for(int原创 2016-12-09 21:28:30 · 325 阅读 · 0 评论 -
109. Convert Sorted List to Binary Search Tree
Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 方法一: 双指针策略,快指针一次走2个节点,慢指针一次走1个节点,当快指针到尾部时,慢指针对应的即为中间节点。但这种方法的时间复杂度为O(N logN):每层递归一共访问N/2原创 2016-12-15 22:08:27 · 330 阅读 · 0 评论 -
140. Word Break II
流传最广的方法,先用DP判断是否可以进行分割,再用dfs遍历方案 class Solution {public: string m_str; unordered_set<string> m_wordDict; vector<string> wordBreak(string s, unordered_set<string>& wordDict) { m_st原创 2016-12-08 22:05:40 · 278 阅读 · 0 评论 -
132. Palindrome Partitioning II
这道题双重DP * 方法1 参考:喜刷刷 class Solution { public: int minCut(string s) { int n = s.size(); if(n<=1) return 0; vector<vector<bool>> isPal(n, vector<bool>(n, false));原创 2016-12-08 21:58:46 · 229 阅读 · 0 评论 -
130. Surrounded Regions
这道题只要把与边缘相连的‘O’全部换成‘V’,然后将所有的除‘V’之外的字母全部换成‘X’,最后再讲所有的‘V’换成‘O’。 方法的就是将DFS与边缘相连的‘O’, 或者BFS与边缘相连的‘O’。但是递归版本的DFS栈溢出,所有用栈的DFS即可。 1. 超时版本 class Solution {public:void solve(vector<vector<char>>& board) {原创 2016-12-08 21:48:58 · 213 阅读 · 0 评论 -
133. Clone Graph
思路:建立一个hash表,原节点与新建立的节点建立对应的关系,然后DFS遍历图也行, BFS遍历图也行。 方法一: BFS public class Solution { public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) { if(node == null) return原创 2016-12-06 22:50:59 · 223 阅读 · 0 评论 -
DFS和BFS 邻接矩阵和邻接表
DFS和BFS实现DFS有递归实现和非递归实现,非递归实现就是用栈来模拟递归的过程,BFS类似二叉树的层序遍历,使用一个LILF的简单队列即可以实现 图的表示用邻接矩阵,DFS和BFSpackage com.cn.jiang;import java.util.ArrayDeque;import java.util.LinkedList;import java.util.Queue;publ原创 2016-12-04 21:45:00 · 744 阅读 · 0 评论 -
动态规划经典问题总结
动态规划解法一般分以下几步: * 描述最优子结构 * 列出状态转移方程 * 从上而下递归求解 或者从下而上递推求解 一般情况下使用递推求解比较方便,最优子结构的描述影响着求解的方式 以下是动态规划经典问题: 最大连续子序列和问题 子结构描述: sum[i] 表示以i结尾最大连续子序列和 状态转移方程 sum[i] = max(sum[i-1]+a[i], a[i]) 代码如下:原创 2017-05-19 22:45:30 · 1992 阅读 · 0 评论