数据结构与算法
本专栏收录一些平时遇到的比较有记录意义的算法题
丨养猪大户丨
兔子拼命跑,乌龟怎么办
展开
-
迪杰斯特拉(Dijkstra)算法
#include <iostream>#include <vector>using namespace std;struct Node{ int v; int dis;};const int MAXV = 100;vector<Node> Adj[MAXV];int n;int d[MAXV];bool vis[MAXV] = { ...原创 2020-05-07 23:09:00 · 203 阅读 · 0 评论 -
统计1到n之间的自然数中有多少个数字1出现
1. 题目描述输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次。在看了剑指offer上的解法之后,发现讲的不是很明晰,于是在网上查找了一下,看到了https://me.csdn.net/yi_Afly的解法,非常清晰明了,我也没法写的更好了,特转载如下:2. 解题思路考虑将n...转载 2020-05-04 11:54:03 · 2623 阅读 · 1 评论 -
快速排序
快速排序主要采用了一个分割的思想,通过某一个元素将序列分为两个部分,然后对左右两个部分再次进行快排。int partition(int a[],int left,int right){ int temp=a[left]; while(left<right){ while(left<right&&a[right]>temp) right--; a[...原创 2020-05-03 23:01:29 · 126 阅读 · 0 评论 -
全组合
题意:输入一个字符串,求出该字符串中字母的所有组合!假设每次组合的字符数长度为m从n个字符中选取m个字符进行组合对于每一个字符,都有两种选择,一个是放入结果中,另一个是不放入结果中如果放入结果中,那么需要从剩下的n-1个字符中选取m-1个字符否则的话,就从剩下的n-1个字符中选取m个字符,递归下去。。。。void combination(string str,int...原创 2020-05-03 21:19:52 · 173 阅读 · 0 评论 -
将二叉搜索树转化成有序的双向链表
问题描述:输入一个二叉搜索树,将该二叉树转化成一个排序的双向链表。要求不能创建任何新的节点,只能够调整树中节点指针的指向。二叉树的节点定义如下:struct Node{ int value; Node * left; Node * right;};由于该树是二叉排序树,所以每个根节点的左指针指向的是其左子树的最右下角的节点,右指针指向的应当是其右子...原创 2020-05-03 19:25:58 · 361 阅读 · 0 评论 -
Bellman-Ford算法
算法(五):图解贝尔曼-福特算法算法简介贝尔曼-福特算法(Bellman–Ford algorithm )用于计算出起点到各个节点的最短距离,支持存在负权重的情况 它的原理是对图进行最多V-1次松弛操作,得到所有可能的最短路径。其优于迪科斯彻算法的方面是边的权值可以为负数、实现简单,缺点是时间复杂度过高,高达O(VE)。但算法可以进行若干种优化,提高了效率。 Bellman...转载 2020-05-03 08:15:34 · 1062 阅读 · 0 评论 -
动态规划——解码方法
题目描述:一条包含字母A-Z 的消息通过以下方式进行了编码:'A' -> 1'B' -> 2...'Z' -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数。示例 1:输入: "12"输出: 2解释:它可以解码为 "AB"(1 2)或者 "L"(12)。此题适宜使用动态规划的方法来做。这里的状态转移方程比较麻烦,我一开始使用...原创 2020-04-25 19:50:58 · 183 阅读 · 0 评论 -
动态规划之——跳跃游戏V
题意:给你一个整数数组 arr 和一个整数 d 。每一步你可以从下标 i 跳到:i + x ,其中 i + x < arr.length 且 0 < x <= d 。i - x ,其中 i - x >= 0 且 0 < x <= d 。除此以外,你从下标 i 跳到下标 j 需要满足:arr[i] > arr[j] 且 arr[i] > ar...原创 2020-04-25 15:17:40 · 407 阅读 · 0 评论 -
链表和数组的二路归并排序
归并排序(Merge Sort)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列。归并排序的具体做法:把原序列不断地递归等分,直至每等份只有一个元素,此时每等份都是有序的。相邻等份合并,不断合并,直至合并完全。二路归并归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and ...原创 2020-04-24 21:13:15 · 734 阅读 · 0 评论 -
背包问题
之前看《算法笔记》的时候发现背包问题那里有点难懂,近日看到好多题目都和背包问题有关,特此整理一下:1 01背包问题1.1 问题描述:有n件物品,每件物品的重量是w[i],价值为c[i]。现在有一个容量为V的包,问如何选择物品放入背包中,使得背包中的物品的总价值最大。其中每个物品都只有一件。注意到,01背包问题的“01”也就体现在每个物品只有一件。1.2 基本思路:如果采用暴力枚举的...原创 2020-04-18 21:44:07 · 271 阅读 · 0 评论 -
找出一个二维数组中的最大的正方形
一个二维数组中的值只有0和1,现在想要找出这个数组中的最大的1所构成的正方形, 要求输出这个正方形的面积这是华为笔试的一道题目, 拿到这个题的第一个想法就是循环套循环, 但是发现时间复杂度太高了,无法AC, 后面也没有做出来这一题, 笔试结束后在网上看了下, 大家给出的是动态规划的方法来做, 现在将这个算法整理如下;首先, 定义一个和原来的矩阵matrix同等大小的矩阵dp[maxn]...原创 2020-04-15 10:51:11 · 1217 阅读 · 0 评论 -
求字符串的全排列
近日参加华为春招的时候被面试官问了一个全排列的问题,当时没有想起来,现在记录一下。原创 2020-04-14 23:13:04 · 184 阅读 · 0 评论 -
组合总数问题——LeetCode 39 40
题意:给定一个无重复元素的数组candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。candidates中的数字可以无限制重复被选取。说明:所有数字(包括target)都是正整数。解集不能包含重复的组合。示例1:输入: candidates = [2,3,6,7], target = 7,所...原创 2020-04-20 22:02:35 · 170 阅读 · 0 评论 -
求一个数字字符串的所有合法的IP地址
近日在面试美团的时候手撕一道回溯法的算法题,题意如下:给定一个数字字符串,要求将这个数字字符串进行分割,使得分割的结果为有效的IP地址。样例输入:25525511135样例输出:255.255.11.135, 255.255.111.35这道题其实可以看做是字符串分段问题,再输入的字符串中加入三个点,将字符串分割成四段,每一段必须合法,求所有可能的情况。目前...原创 2020-04-19 21:51:25 · 3629 阅读 · 0 评论 -
由二叉树的中序后序遍历序列确定先序遍历序列
思路:只讲解如何通过中序后序遍历序列来构建二叉树:假设递归的过程中某部的后序序列区间为[postL,postR],中序序列的区间为[inL, inR],那么由后序序列的性质可知,后序序列的最后一个元素post[postR]即为根节点。那么,我们在中序序列中找到一个位置i,使得in[i]==post[postR],这样就找到了中序序列的根节点。那么锁子书中的节点的个数numLeft=i-inL...原创 2020-04-19 16:30:49 · 350 阅读 · 0 评论 -
统计字符串中出现次数最多的单词
题意令“单词”定义为大小写字母和数字的组合,给出一个字符串,问出现次数最多的单词机器出现的次数(一切除了大小写字母和数字之外的字符都作为单词的分隔符),其中字母不区分大小写,且最后按照小写字母输出。思路:从给定的字符串中分割出“单词”,计数出现次数最多的单词(用map实现)#include<iostream>#include <string>#incl...原创 2020-04-19 10:23:22 · 2398 阅读 · 0 评论 -
先序中序确定后序
// 中序先序确定后序.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include <iostream>#include <cstdio>#include <stack>#include <algorithm>using namespace std;const int maxn = 50;str...原创 2020-04-09 14:48:58 · 354 阅读 · 0 评论