
算法
Icarus_
会一点Android
展开
-
贪心算法
贪心算法贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。[1]特性编辑贪婪算法可解决的问题通常大部分都有如下的特性:⑴随转载 2015-11-02 20:44:08 · 971 阅读 · 0 评论 -
图的深度优先遍历
用一个邻接矩阵表示图#includeusing namespace std;int e[101][101], sum,n,m, book[101];void dfs(int cur) { cout << cur; sum++; if (sum == n) return; for (int i = 1; i <= n; i++) { if (e[cur][i] == 1&&原创 2016-02-11 20:09:33 · 531 阅读 · 0 评论 -
弗洛伊德算法求最短路径
1,从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。2,对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比已知的路径更短。如果是更新它。把图用邻接矩阵G表示出来,如果从Vi到Vj有路可达,则G[i,j]=d,d表示该路的长度;否则G[i,j]=无穷大。定义一个矩阵D用来记录所插入点的信息,D[i,j]表示从Vi到原创 2016-02-14 16:24:47 · 4554 阅读 · 1 评论 -
图的广度优先遍历
将图表示为邻接矩阵#includeusing namespace std;int main() { int i,j,n, m, e[100][100], book[100] = { 0 }, cur, a, b; int que[10000], head, tail; cout << "输入元素个数和顶点之间的边的个数" << endl; cin >> n >> m; for (原创 2016-02-11 20:44:31 · 488 阅读 · 0 评论 -
归并排序
归并排排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归归并。归并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1原创 2016-03-08 15:55:46 · 408 阅读 · 0 评论 -
算法学习(一)面试问题
1-1对一组数据进行排序:可以用快速排序O(nlogn),但是只能证明会快排,但忽略了使用环境。(1)所以可以和面试官探讨:1、这组数据有什么样的特征,比如是否包含大量重复元素,如果有那么三路排序更好,如果所有的排序都是独特的那普通的就好了。(很多语言的标准库都是三路快排)。2、是否大部分数据距离他的正确位置很近?是否近乎有序?比如对银行近期发生的数据进行排序大多数这样就是近乎...原创 2019-07-13 22:07:05 · 185 阅读 · 0 评论 -
算法学习(二)时间复杂度
一、时间复杂度分析1、什么是大OO(f(n))表示运行算法所需要执行的指令数,和f(n)成正比二分查找法O(longn) 所需执行指令数: a*longn 寻找数组中最大/最小值O(n) 所需执行指令数 :b*n 归并排序O(nlogn) 所需指令数:c*nlogn 选择排序O(n^2) 所需指令数:d*n^21从图中可以看出来n的差距是量级上的差距,可以看...原创 2019-07-13 22:08:48 · 551 阅读 · 0 评论 -
算法学习(三)数组问题
一、数组的问题leetCode283. 移动零给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。//时间复杂度O(n),空间复杂度O(n)class Solution { publ...原创 2019-07-13 22:09:57 · 381 阅读 · 0 评论 -
算法学习(四)查找问题
一、查找问题通常有2类1、查找有无 :元素a是否存在?set;集合2、查找对应关系(键值对应):元素a出现了几次?map;字典leetcode349. 两个数组的交集给定两个数组,编写一个函数来计算它们的交集输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。输入: nums1 = [1,2,2,1], nums2 = [2,2]输出: [2]在这里输出的每个...原创 2019-07-21 20:37:07 · 590 阅读 · 0 评论 -
算法学习(五)链表
leetcode206. 反转链表输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode ...原创 2019-07-21 21:42:24 · 229 阅读 · 0 评论 -
算法学习(七)二叉树和递归
一、二叉树天然的递归结构二叉树遍历private void preOrder(TreeNode node) { if (node == null) { return; } System.out.print(node.val); preOrder(node.left); preOrder...原创 2019-08-13 11:31:03 · 210 阅读 · 0 评论 -
算法学习(六)栈和队列
栈的基础使用leetcode20. 有效的括号给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。 输入: "()" --- 输出: true 输入: "()[]{}"---输出: true 输入: "(]"---输...原创 2019-08-13 11:29:21 · 528 阅读 · 0 评论 -
算法学习(八)递归和回溯法
这样的算法思想通常都应用在树形问题上leetcode17. 电话号码的字母组合给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。输入:"23"输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].转换为树...原创 2019-08-20 17:16:36 · 265 阅读 · 0 评论 -
广度优先搜索的学习
同样也是用一个迷宫的例子#includeusing namespace std;struct note{ int x;//横坐标 int y;//纵坐标 int s;//步数};int main() { struct note que[2501];//设地图50X50,所以队列2500 int a[51][51] = { 0 };//地图 int book[51][51]原创 2016-02-10 12:01:49 · 369 阅读 · 0 评论 -
深度优先搜索的学习
解决深度优先搜索关键在于“当下该如何做”到”下一步该如何做“。通常是把每一种方法都尝试一遍,当这一步解决后进行下一步。基本模型:void dfs(int step){ 判断边界 尝试每一种可萌 for(int i=1;i<=n;i++){ 继续下一步 } 返回}举例:输入一个数n,输出1~n的全排列/*全排列问题,举个例子就是有几张牌放在原创 2016-02-05 14:18:09 · 482 阅读 · 0 评论 -
迪杰斯特拉算法求最短路径
单源最短路径问题的求解单源最短路径就是一个点到其他各点最短路径用二维数组存储顶点与边的关系原创 2016-02-15 21:48:51 · 2079 阅读 · 0 评论 -
用栈判断回文
#include#includeusing namespace std;int main() { string a; char s[100]; int min, next, top,len,mid; cin >> a; len = a.length();//求出栈的长度 mid = len / 2;//中间断开的位置 top = 0; for (int i = 0; i <原创 2016-02-02 20:52:42 · 1043 阅读 · 0 评论 -
分治法求最大最小元
#includeusing namespace std;int fmax(int a, int b) { return (a > b) ? a : b;}int fmin(int a, int b) { return(a < b) ? a : b;}void maxmin(int *l, int &max, int &min, int a, int b) { int x1, y1原创 2016-03-18 14:32:59 · 2064 阅读 · 0 评论 -
java语言实现冒泡排序、简单选择排序、反转排序
package person;import java.util.Scanner;public class Jerque { public static void main(String[] args){ System.out.println("输入数据"); int[]l=new int [10]/*{55,41,2,1,6,9,8,4,2,3}*/; for(i原创 2016-03-19 13:41:52 · 2199 阅读 · 0 评论 -
简单的计数排序
输入10个数最大的不超过100#includeusing namespace std;int main() { int A[10]; int C[100] = { 0 }; int B[10] = { 0 }; for (int i = 0; i < 10; i++) { cin >> A[i]; C[A[i]]++; } for (int i = 1; i < 100原创 2016-04-23 22:25:18 · 498 阅读 · 0 评论 -
简单插入排序
简单的插入排序函数 for (i=1;i<n;i++)//第一个数已经有序 { temp=a[i];//temp用来保存待插入的数 for (j=i-1;j>=0&&a[j]>temp;j--)//边判断边保存 a[j+1]=a[j]; a[j+1]=temp; }原创 2016-03-02 20:15:35 · 353 阅读 · 0 评论 -
快速排序
简单的快速排序C++语言实现#includeusing namespace std;int a[100], n;void qsort(int left, int right) { int i, j, t,temp; if (left > right) return; temp = a[left]; i = left; j = right; while (i != j) {原创 2016-03-02 19:42:06 · 367 阅读 · 0 评论 -
堆排序
堆排序是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为最大堆和最小堆,是完全二叉树。最大堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是最大堆,因为根据最大堆的要求可知,最大的值一定在堆顶。堆是一种特殊的完全二叉树,如果一个完全二叉树父结原创 2016-03-05 21:46:15 · 536 阅读 · 1 评论 -
并查集
并查集是一种树型的数据结构,用于处理一些不相交集集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。集就是让每个元素构成一个单元素的集合,也就是按一定顺序将属于同一组的元素所在的集合合并。在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题原创 2016-03-05 21:20:23 · 362 阅读 · 0 评论 -
Bellman-Ford算法的队列优化
上一篇文章对Bellman-Ford算法的一种优化是每次仅对最短路程发生了变化的点的相邻边执行优化操作。这里可以用队列来维护这些点#includeusing namespace std;int main() { int m, n; int u[8], v[8], w[8]; //数组大小要比m的最大值大1 int first[6], next[8];//first比n大1,n原创 2016-03-05 13:55:28 · 526 阅读 · 0 评论 -
Bellman-Ford(贝尔曼,福特)算法——解决负权边
Dijkstra算法不能解决带有负权边的图(边的权值为负数)。而Bellman-Ford算法可以解决这个问题#includeusing namespace std;int main() { int dis[10], bak[10];//bac用来备份dis int n, m, u[10], v[10], w[10], check, flag; int inf = 999999原创 2016-03-05 13:47:39 · 1848 阅读 · 0 评论 -
java语言判断一个数是否为素数
public static boolean isPrime(int n){ if(n<2) return false; for(int i=2;i*i<=n;i++){ if(n%i==0) return false; return true; }}原创 2017-03-04 16:36:47 · 1338 阅读 · 0 评论 -
poj的题目分类
转载自poj题目分类初期:一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj3295) (6)模拟法.(poj1068,poj2632,poj1573,poj2993,转载 2016-03-18 15:29:58 · 495 阅读 · 0 评论 -
UVa1585 Score
就是说一个由O X组成的字符串,每个O得分为连续出现的O的个数,X得分为0; 如:OOXXOXXOOO的得分为1+2+0+0+1+0+0+1+2+3=10原题:There is an objective test result such as OOXXOXXOOO". An `O' means a correct answer of a problem and an `X' m原创 2016-04-12 20:20:52 · 531 阅读 · 0 评论