
数据结构与算法
happy的
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
算法复习——插入排序
原理都很清楚:让从1到n-1遍历,将插入到之前已经排序好的子序列[]中,用二分法找到插入的位置。看起来很简单,但是实现的时候,也需要思考一些细节。二分法的插入排序关键在于插入位置的下标。void insertsort(int *arr, int n){/* arr: array, n: size of arr*/ int s, t, mid; for(int i...原创 2019-03-12 16:57:06 · 141 阅读 · 0 评论 -
两个贪心算法——Leetcode321拼接最大数和Leetcode316去除重复字母
贪心算法和梯度下降法很像,每一步取当前最优解。但是得保证每一步取最优解,最后会取到全局最优解。首先看Leetcode316,去除重复字母。题目是这样的:给定一个仅包含小写字母的字符串,去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置)。示例 1:输入: "bcabc"输出: "abc"示例 2:输入: "cbacdc...原创 2019-08-16 17:44:40 · 452 阅读 · 0 评论 -
回溯法
对于八皇后,求解数独这种有有限个解空间的题目,考虑回溯法。回溯需要有回溯的状态空间,以及回溯的节点。以数独为例回溯的每个节点为数独盘上的点,每个点上能放的数组为状态空间。递归即可解决。...原创 2019-08-04 15:29:33 · 117 阅读 · 0 评论 -
寻找二叉树最大深度104lc
今天头条面试遇到这道题,还要求出路径。非递归虽然很直观,但是要加上一个栈保存每个节点的深度。如果要非递归保存路径的话,还得加一个栈保存路径。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right...原创 2019-07-15 21:57:12 · 132 阅读 · 0 评论 -
leetcode 222——完全二叉树节点个数
二分法求解。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * };...原创 2019-07-14 16:20:02 · 98 阅读 · 0 评论 -
Leetcode 43字符串相乘
这种题目看起来简单,但是逻辑实现起来也不容易。一开始,思路没有打开,容易陷入拆东墙补西墙的修bug过程。第一个版本啰嗦且没有可读性:class Solution {public: string multiply(string num1, string num2) { int n1 = num1.size(); int n2 = num2.s...原创 2019-07-13 20:28:02 · 87 阅读 · 0 评论 -
Sort character by frequency
注意字符串的操作,这道题就是把所有的字符统计起来,然后每次拼接找最大值static int fast_io = []() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); return 0;}();class Solution {public: string frequenc...原创 2019-06-24 22:35:21 · 223 阅读 · 0 评论 -
Leetcode_find_k_pairs_smallest_sum
利用堆,维护当前最小值。vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) { auto cmp = [](pair<int, int> x, pair<int, int> y)...原创 2019-06-24 21:58:06 · 166 阅读 · 0 评论 -
堆_leetcode23,合并K个排序链表
利用堆排序,维护一个最小堆,取每个链表最前的节点组成堆,每次取出堆顶class Solution {public: ListNode* mergeKLists(vector<ListNode*>& lists) { ListNode *result = nullptr, *p = nullptr; auto cmp = []...原创 2019-06-24 21:05:17 · 127 阅读 · 0 评论 -
leetcode_402_Remove K Digits
使用栈来解题。主要思想:一个n位数,如果第i位比第i+1位要大,那么删掉第i位得到的数要比删掉第i+1位得到的数要小。给定一个栈,result入栈过程:int i = 0;while(i < num.size()){ while(k && result.size() && result.back() > num[i]){ ...原创 2019-06-10 09:17:23 · 133 阅读 · 0 评论 -
Leetcode 697
#697 Degree of an Array虽然思路差不多,但是代码值得斟酌int cnt[50000];class Solution {public: int findShortestSubArray(vector<int>& a) { ios_base::sync_with_stdio(false); cin.tie...原创 2019-06-05 22:32:08 · 170 阅读 · 0 评论 -
c++ map vs unordered_map
两个都是map的实现,但是有性能上的区别map是BST(比如红黑树),查找效率logn,unorder_map是哈希表,查找效率平均为o(1),最差是o(n)插入和删除效率来说,map的插入也为log(n)且加上平衡时间,unordered_map插入和删除都是o(1),和查找一样红黑树,avl tree都是一种bst。一般来说,当插入和删除占大部分时间的时候,使用红黑...原创 2019-06-05 21:56:47 · 542 阅读 · 0 评论 -
LeetCode刷题刷题
rotating array看到一个解法惊艳到了,记录下来Given an array, rotate the array to the right byksteps, wherekis non-negative.Example 1:Input: [1,2,3,4,5,6,7] and k = 3Output: [5,6,7,1,2,3,4]Explanation:...原创 2019-06-05 20:59:27 · 435 阅读 · 0 评论 -
LeetCode——382Linked List Random Node
Given a singly linked list, return a random node's value from the linked list. Each node must have thesame probabilityof being chosen.Follow up:What if the linked list is extremely large and its ...原创 2019-04-10 14:47:33 · 2684 阅读 · 0 评论 -
算法复习——KMP算法(字符串匹配)
字符串匹配问题描述:定义:如果给定字符串T以及字符串S,|T|>=|S|,存在正整数i,使得T[i, i+|S|] = S,则称S为T的子串。给定一个模式字符串pat,以及一个字符串str,问str是否为pat的字串,如果是,给出子串在pat中开始的位置。一个很直观的暴力解决方法是:定义两个指针i,j。0)初始时,i指向pat[0],j指向str[0]。1)检查...原创 2019-04-10 11:34:29 · 289 阅读 · 0 评论 -
算法复习——归并排序
归并排序是分支思想的一种体现(Divide and Conquer)。其具体思想如下:1)将乱序数组对半分成两份,每一份为子序列2)重复1),使得子序列长度为13)归并每两两相邻的子序列4)重复3,使得子序列归并为原数组长度代码如下(递归版本)void merge(int *arr, int s, int mid, int t){ int *result =...原创 2019-03-13 09:47:03 · 142 阅读 · 0 评论 -
算法复习——堆排序
堆排序主要需要先理解清楚堆(heap)。堆的定义:对于序列,若满足或者,其中,则称该序列为堆。堆可以看做是一棵二叉树。我们讨论升序排序,所以我们需要的是最大堆,也就是父节点的值总是大于等于任何一个子节点的值。堆排序的步骤:1) 输入乱序数组2)调整为最大堆。先调整每个非叶节点,使得该节点为根节点的子树为最大堆。3)将根节点与最后一个节点的值互换,并将互换后的最后一个节点...原创 2019-03-12 17:29:34 · 106 阅读 · 0 评论