数据结构与算法
面试高频算法整理
盼盼编程
这个作者很懒,什么都没留下…
展开
-
linux下调试core dump方式汇总,工作必备技能
调试,是开发流程中一个非常重要的环节。每个程序员都应,具备调试代码的能力,尤其对于从事 Linux 下的开发的读者。从事 linux 下后台开发,有时候会遇到程序突然崩溃的情况,也没有任何日志,这会让你不知所措。今天给大家介绍一个 core 文件,用这个文件,我们可以找出对应出错的代码行,感觉是不是很神奇。透着树荫看着朦胧的太阳,晒着日光浴,...原创 2021-03-07 09:43:20 · 2597 阅读 · 120 评论 -
栈和队列互相实现,一文弄懂它们的关系
专注后台开发相关技术,广度深度并存,干货情怀同在。微信搜索【晨梦思雨】关注这个不一样的程序员。前言栈和队列是比较基础的数据结构。无论在工作中,还是在面试中,栈和队列都用的比较多。在计算机的世界,你会看到队列和栈,无处不在。栈:一个先进后出的数据结构队列:一个先进先出的数据结构栈和队列这两种数据结构,同时也存在某种联系。用栈可以实现队列,用队列也可以实现栈。海边风景不错,欣赏一下风景,下面开始步入正题。学完这篇,咱们再接着看风景。两个栈实现一个队列...原创 2021-03-06 17:54:26 · 1865 阅读 · 61 评论 -
大厂动态规划面试汇总,提升内功
注:本文是BAT真题收录很值得大家花心思看完,看完会有收获。前言算法是面试大公司必考的项目,所以面试前准备好算法至关重要,今天整理的常见的动态规划题目,希望可以帮到大家。要想学习其他绝世武功,要先打好基础。算法属于内功,则更为重要。强盗抢劫题目:强盗抢劫一排房间,每个房间都有钱,不能抢劫两个相邻的房间,要求抢的钱最多。数组如:[2,7,9,3,1]思路:当输入房间数为0,1,2时,这个很好判断,当输入房间数字大于3时,就要用到动态规划了,方程是:dp[i]是当抢到第i个数时原创 2021-02-15 11:49:35 · 3772 阅读 · 50 评论 -
算法:杨辉三角
func generate(numRows int) [][]int { ans := make([][]int, numRows) for i := range ans { //分配内存 ans[i] = make([]int, i+1) //收尾都为1 ans[i][0] = 1 ans[i][i] = 1 //注意循环范围 for j := 1; j < i; j.原创 2021-01-08 22:21:13 · 293 阅读 · 4 评论 -
算法:验证回文串
方法一:遍历字符串取出数字和字母方到另一个字符串中,然后逆序这个字符串判断和原串是否相等方法二:双指针(左右两边扫,然后判断字符串是否相同,需要将用到额外空间。双指针不一定是两个指针,也可以是下标)func isPalindrome(s string) bool { var sgood string //取出需要判断的字符 for i := 0; i < len(s); i++ { if isalnum(s[i]) { sgood .原创 2021-01-08 22:18:33 · 251 阅读 · 4 评论 -
程序员笑话107
女生都是善良的,对各种小动物毫无抵抗力,例如:路虎、悍马、宝马、捷豹,当然还有天猫,除了程序猿。原创 2021-01-06 22:38:55 · 272 阅读 · 7 评论 -
算法:串联所有单词的子串
//串联所有单词的子串//两个hashmap解决问题public List<Integer> findSubstring(String s, String[] words) { List<Integer> res = new ArrayList<Integer>(); //字符串数组长度 int wordNum = words.length; if (wordNum == 0) { return res; .原创 2021-01-06 22:10:24 · 274 阅读 · 5 评论 -
算法:环形链表
//环形链表//哈希表func hasCycle(head *ListNode) bool { seen := map[*ListNode]struct{}{} for head != nil { if _, ok := seen[head]; ok { return true } //标记该节点已被访问 seen[head] = struct{}{} head = head..原创 2021-01-06 22:09:30 · 306 阅读 · 5 评论 -
算法:恢复二叉搜索树
//显示中序遍历func recoverTree(root *TreeNode) { nums := []int{} var inorder func(node *TreeNode) inorder = func(node *TreeNode) { if node == nil { return } inorder(node.Left) nums = append(nums, node.V.原创 2021-01-05 22:01:01 · 281 阅读 · 4 评论 -
算法:交错字符串
func isInterleave(s1 string, s2 string, s3 string) bool { n, m, t := len(s1), len(s2), len(s3) if (n + m) != t { return false } f := make([][]bool, n + 1) for i := 0; i <= n; i++ { f[i] = make([]bool, m + 1) }.原创 2021-01-05 22:00:01 · 253 阅读 · 4 评论 -
算法:扰乱字符串
class Solution { public boolean isScramble(String s1, String s2) { char[] chs1 = s1.toCharArray(); char[] chs2 = s2.toCharArray(); int n = s1.length(); int m = s2.length(); if (n != m) { return false.原创 2021-01-05 21:58:56 · 276 阅读 · 4 评论 -
算法:正则表达式匹配
主要理解动态规划的过程,对应几种状态分别写出对应动态方程。//正则表达式匹配(动态规划)//* 表示匹配'零个'或'多个'前面的那一个元素//通过p来匹配sfunc isMatch(s string, p string) bool { m, n := len(s), len(p) matches := func(i, j int) bool { if i == 0 { return false } if.原创 2021-01-05 21:57:48 · 367 阅读 · 4 评论 -
算法:N皇后问题
n皇后问题研究的是如何将n个皇后放置在n×n的棋盘上,并且使皇后彼此之间不能相互攻击。上图为 8 皇后问题的一种解法。给定一个整数n,返回所有不同的n皇后问题的解决方案。每一种解法包含一个明确的n皇后问题的棋子放置方案,该方案中'Q'和'.'分别代表了皇后和空位。示例:输入: 4输出: [ [".Q..", // 解法 1 "...Q", "Q...", "..Q."], ["..Q.", // 解法 2 "Q...", ...原创 2021-01-05 21:55:38 · 540 阅读 · 5 评论 -
买卖股票的最佳时机|||
//可以买卖2次一天结束时,可能有持股、可能未持股、可能卖出过1次、可能卖出过2次、也可能未卖出过所以定义状态转移数组dp[天数][当前是否持股][卖出的次数]class Solution: def maxProfit(self, prices): if prices==[]: return 0 length=len(prices) dp=[ [[0,0,0],[0,0,0] ] for i in.原创 2021-01-04 23:27:57 · 230 阅读 · 4 评论 -
买卖股票的最佳时机||
注意动态方程的推导func maxProfit(prices []int) int { n := len(prices) dp0, dp1 := 0, -prices[0] for i := 1; i < n; i++ { dp0, dp1 = max(dp0, dp1+prices[i]), max(dp1, dp0-prices[i]) } return dp0}func max(a, b int) int { ..原创 2021-01-04 23:25:55 · 220 阅读 · 7 评论 -
Pow(x, n)
//递归分治func myPow(x float64, n int) float64 { if n >= 0 { return quickMul(x, n) } return 1.0 / quickMul(x, -n)}func quickMul(x float64, n int) float64 { if n == 0 { return 1 } //先一直递归,通过递归进行分治 y := quickM.原创 2021-01-04 23:25:04 · 251 阅读 · 4 评论 -
二叉树的公众祖先
//递归func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode { if root == nil { return nil } if root.Val == p.Val || root.Val == q.Val { return root } //查左子树,返回为NIL表示找不到 left := lowestCommonAncestor(root.Left, ...原创 2021-01-04 23:23:28 · 325 阅读 · 5 评论 -
二叉搜索树的最近公共祖先
//二叉搜索树的最近公共祖先//找对应两个节点路径就可以知道两个节点的最近公共祖先func getPath(root, target *TreeNode) (path []*TreeNode) { //path 存储节点路径 node := root for node != target { path = append(path, node) if target.Val < node.Val { node = no.原创 2021-01-04 23:20:09 · 236 阅读 · 4 评论 -
二个栈实现一个队列
//二个栈实现一个队列type CQueue struct { stack1, stack2 *list.List}//初始化func Constructor() CQueue { return CQueue{ stack1: list.New(), stack2: list.New(), }}//尾部插入(出栈)func (this *CQueue) AppendTail(value int) { this.stack1.原创 2021-01-04 23:19:22 · 224 阅读 · 4 评论 -
队列实现栈
//用队列实现栈//使用2个队列,使用了队列交换的思想type MyStack struct { queue1, queue2 []int}func Constructor() (s MyStack) { return}func (s *MyStack) Push(x int) { //将元素入队到queue2 s.queue2 = append(s.queue2, x) for len(s.queue1) > 0 { s....原创 2021-01-04 23:18:55 · 220 阅读 · 4 评论 -
算法:柱状图中最大矩形
//柱状图中最大矩形//枚举宽,固定一边枚举另一边,然后计算面积class Solution {public: int largestRectangleArea(vector<int>& heights) { int n = heights.size(); int ans = 0; // 枚举左边界 for (int left = 0; left < n; ++left) { .原创 2020-12-30 22:59:40 · 351 阅读 · 4 评论 -
算法:文本左右对齐
//文本左右对齐1.尽可能多的在每行放置更多的单词,必要时用' '填充2.要求更可能均匀的分配单词间空格的数量,如果某一行不能均匀分配,那左侧放置的空格数要多于右侧3.文本最后一行要左对齐,且单词之间不能插入额外的空格string fillWords(vector<string>& words, int bg, int ed, int maxWidth, bool lastLine = false){ //单词数量 int wordC...原创 2020-12-30 22:58:48 · 952 阅读 · 4 评论 -
算法:插入区间
//插入区间func insert(intervals [][]int, newInterval []int) (ans [][]int) { //取出新区间左端点和右端点 left, right := newInterval[0], newInterval[1] merged := false for _, interval := range intervals { if interval[0] > right { //.原创 2020-12-30 22:57:49 · 441 阅读 · 4 评论 -
算法:解数独
//递归func solveSudoku(board [][]byte) { var line, column [9][9]bool var block [3][3][9]bool var spaces [][2]int for i, row := range board { //按行遍历 for j, b := range row { if b == '.' { //保存对应行,.原创 2020-12-28 20:24:33 · 586 阅读 · 5 评论 -
算法:有效的数独
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。//有效数独class Solution { public boolean isValidSudoku(char[][] board) { // init data HashMap<Integer, Integer> [] rows = ne原创 2020-12-28 20:23:21 · 346 阅读 · 4 评论 -
算法:编辑距离
题目描述:给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入: word1 = "horse", word2 = "ros"输出: 3解释: horse -> rorse (将 'h' 替换为 'r')rorse -> rose (删除 'r')rose -> ros (删除 'e')输入: word1 = "i原创 2020-12-28 20:23:02 · 365 阅读 · 4 评论 -
算法:矩阵置零
矩阵置0,要求常数空间//额外存储空间class Solution { public void setZeroes(int[][] matrix) { //行 int R = matrix.length; //列 int C = matrix[0].length; Set<Integer> rows = new HashSet<Integer>(); Set<Integer> cols = new HashSet.原创 2020-12-28 20:22:24 · 383 阅读 · 4 评论 -
算法:买卖股票的最佳时机含冷冻期
把几种状态对应的dp分析出来func maxProfit(prices []int) int { if len(prices) == 0 { return 0 } n := len(prices) // f[i][0]: 手上持有股票的最大收益 // f[i][1]: 手上不持有股票,并且处于冷冻期中的累计最大收益 // f[i][2]: 手上不持有股票,并且不在冷冻期中的累计最大收益 f := make([][3]int, n.原创 2020-12-21 23:44:51 · 246 阅读 · 5 评论 -
算法:最接近的三数之和
//最接近的三数之和func threeSumClosest(nums []int, target int) int { //排序 sort.Ints(nums) var ( n = len(nums) //记录最大数 best = math.MaxInt32 ) // 根据差值的绝对值来更新答案 update := func(cur int) { if abs(cur - target).原创 2020-12-21 23:43:49 · 382 阅读 · 5 评论 -
算法:z字型变换
//z字型变换:先按Z字型排列,然后横着输出//numRows为对应斜着的个数//按行排序//numRows表示行数,就是竖着的单词class Solution {public: string convert(string s, int numRows) { if (numRows == 1) return s; vector<string> rows(min(numRows, int(s.size()))); //当前的.原创 2020-12-21 23:42:41 · 443 阅读 · 4 评论 -
算法:螺旋矩阵 ||
//分别对每个边界进行赋值class Solution { //假设3*3矩阵 public int[][] generateMatrix(int n) { //左右上下边界 int l = 0, r = n - 1, t = 0, b = n - 1; int[][] mat = new int[n][n]; //tar 是总数 int num = 1, tar = n * n; whi.原创 2020-12-17 21:29:02 · 319 阅读 · 4 评论 -
算法:合并区间
排序之后比较端点值大小,然后进行合并//排序之后比较端点值大小,然后进行合并class Solution {public: vector<vector<int>> merge(vector<vector<int>>& intervals) { if (intervals.size() == 0) { return {}; } //排序 sort.原创 2020-12-17 21:27:17 · 438 阅读 · 4 评论 -
算法:旋转链表
将每个节点向后移动k个位置class Solution { public ListNode rotateRight(ListNode head, int k) { if (head == null) return null; if (head.next == null) return head; ListNode old_tail = head; int n; //先将链表连成环 for(n = 1; old_tail.next != null;原创 2020-12-17 21:26:29 · 250 阅读 · 4 评论 -
算法:旋转图像
//原地旋转矩阵//转置加旋转class Solution { public void rotate(int[][] matrix) { int n = matrix.length; //斜对交换 for (int i = 0; i < n; i++) { for (int j = i; j < n; j++) { int tmp = matrix[j][i]; matrix[j][i] = matrix..原创 2020-12-16 22:29:21 · 267 阅读 · 4 评论 -
算法:四数之和
//四数之和func fourSum(nums []int, target int) (quadruplets [][]int) { //对数组进行排序,注意有序数组这个规律进行剪枝 sort.Ints(nums) n := len(nums) //遍历整个数组 for i := 0; i < n-3 && nums[i]+nums[i+1]+nums[i+2]+nums[i+3] <= target; i++ { .原创 2020-12-16 22:27:30 · 379 阅读 · 4 评论 -
算法:全排列||
//全排列|| (数组中有重复的元素)//递归加回溯func permuteUnique(nums []int) (ans [][]int) { //对数组进行排序 sort.Ints(nums) n := len(nums) perm := []int{} //标记是否被访问 vis := make([]bool, n) var backtrack func(int) backtrack = func(idx int) { .原创 2020-12-15 21:43:55 · 277 阅读 · 5 评论 -
二叉树的最大深度和最小深度
获取二叉树的最大深度和最小深度//获取最小深度func minDepth(root *TreeNode) int { if root == nil { //最后返回0,所以结果要+1 return 0 } if root.Left == nil && root.Right == nil { return 1 } //初始化最小值 minD := math.MaxInt32 //.原创 2020-12-15 21:41:47 · 411 阅读 · 5 评论 -
算法:三角形最小路径和
//三角形最小路径和func minimumTotal(triangle [][]int) int { //有多少行 n := len(triangle) f := make([][]int, n) for i := 0; i < n; i++ { f[i] = make([]int, n) } f[0][0] = triangle[0][0] for i := 1; i < n; i++ { .原创 2020-12-15 21:40:38 · 301 阅读 · 4 评论 -
算法:字符串相加
字符串相加:模拟整数相加func addStrings(num1 string, num2 string) string { add := 0 ans := "" for i, j := len(num1) - 1, len(num2) - 1; i >= 0 || j >= 0 || add != 0; i, j = i - 1, j - 1 { var x, y int //求出对应十进制 if i >=.原创 2020-12-14 22:01:26 · 473 阅读 · 5 评论 -
算法:两数相除
class Solution {public: int divide(int dividend, int divisor) { if(dividend == 0) return 0; if(divisor == 1) return dividend; if(divisor == -1){ if(dividend>INT_MIN) return -dividend;// 只要不是最小的那个整数,都是直接返回相反数就好啦.原创 2020-12-14 22:00:35 · 998 阅读 · 4 评论