算法总结
血江南
这个作者很懒,什么都没留下…
展开
-
动态规划和贪心算法问题(二)
1.贪心算法 每一步都做出当时看起来最佳的选择。也就是说,总是做出局部最优的选择,寄希望这样的选择能导致全局最优解。贪心算法并不保证得到最优解,但是对很多问题确实可以求得最优解。包括最小生成树和Dijkstra算法,以及一些启发式NP算法。 2.贪心算法问题 2.1活动选择问题: 有一个需要使用每个资源的n个活动组成的集合S= {a1,a2,···,an },资源每次只能由一个活动使用。每原创 2016-07-13 21:33:20 · 478 阅读 · 0 评论 -
剑指offer-位运算
在对unsigned类型的无符号值进行右移位时,左边空出的部分用0补齐,而对于带符号值移位左边用符号位补齐。 问题1.实现函数getbits(unsigned x,int p,int n),返回x中从右边数第p位开始向右数n位的字段。例如get(x,4,3),返回x中第4,3,2位的值.unsigned getbits(unsigned x,int p,int n){ //x=10111原创 2016-09-03 17:30:20 · 302 阅读 · 0 评论 -
斐波那契数组的算法应用总结
1、爬楼梯问题:青蛙可以跳上一级台阶,也可以跳上两级,求该青蛙跳上一个n级的台阶共有多少种跳法。 思路:没有台阶是0种,1级台阶是1种,2级台阶是3种。把n级台阶的跳法看成是n的函数f(n)。第一次跳的时候又两种选择:一次是跳一级,此时的跳法是前面n-1级台阶的跳法数目f(n-1);另一种选择是第一次跳2级,此时跳法数目等于后面剩下的n-2级台阶跳法数目f(n-2)。所以,f(n)=f(n-1)+原创 2016-09-03 15:45:35 · 1259 阅读 · 0 评论 -
剑指offer-递归和循环
递归虽然比较简洁,但他同时也有显著的缺点。递归由于是函数调用自身,而函数调用是有时间和空间的消耗的,每一次函数调用都需要在内存栈中分配空间以保存参数、返回地址及临时变量,而且往栈里压入数据和弹出数据都需要时间。 1、 斐波那契数列 0,1,1,2,3,5,8,13 …//递归 缺陷:重复计算的太多int Fib(int n){ if(n==0)原创 2016-09-03 15:13:37 · 188 阅读 · 0 评论 -
剑指offer-排序算法
十大排序算法自主手写代码: 1、冒泡排序 时间O(N^2),空间O(1),稳定,数据有序效果越好void BubbleSort(int a[],int n){ int flag=1; for(int i=1;i<n&&flag;i++){ flag=0; //表示有序 for(int j=1;j<n-i+1;j++){原创 2016-09-01 12:37:56 · 327 阅读 · 0 评论 -
剑指offer-查找
问题1、二分查找//注意:二分查找的前提是数组基本有序int BinarySearch(int a[],int low,int high,int key){ while(low<=high){ int mid=low+(high-low)/2; if(a[mid]==key) return mid; e原创 2016-08-30 19:48:02 · 227 阅读 · 0 评论 -
剑指offer-队列和栈操作
问题1、两个栈实现队列class Queue{public: //入队 void Push(const int value){ s1.push(value); } //出队 int Pop(){ while (s1.size()) { s2.push(s1.top());原创 2016-08-30 17:55:39 · 192 阅读 · 0 评论 -
数组相关算法
问题1、打印1到最大的n位数//解法一、直接求出n位数的最大值,然后直接从1开始打印//缺陷:可能会溢出,大数问题void Print1toMax(int n){ int num=1; while(n>0){ num*=10; n--; } for(int i=1;i<num;i++){ cout<<i<<" ";原创 2016-09-03 21:10:03 · 322 阅读 · 0 评论 -
剑指offer-动态规划算法
问题1、连续子数组的最大和//给定数组{1,-2,3,10,-4,7,2,-5},则连续子数组的的最大和范围为{3,10,-4,7,2}//解法一、直接写int FindGreatestSumOfSubArray(int a[],int n){ int sum=0; int temp=0; for(int i=0;i<n;i++){ if(sum<=0){原创 2016-09-04 15:33:58 · 536 阅读 · 0 评论 -
数组求和相关算法
问题1、输入一个数组,在数组中查找两个数,使得它们的和正好是targetvoid FindTwoSum(int a[],int n,int target){ sort(a,a+n); int sum=0; int i=0; int j=n-1; while(i<j){ sum=a[i]+a[j]; if(sum==target)原创 2016-09-04 18:54:21 · 2227 阅读 · 0 评论 -
华为OJ之漂亮度
知识点:map pair vector string 1.map容器的相关操作map<string,int> ismap; //map定义变量,每个key唯一,value可以不同string word;while(cin>>word){ map[word]++; //有计数的功能}//1.关联容器的初始化赋值操作map<string,int> ism原创 2016-08-10 18:25:03 · 350 阅读 · 0 评论 -
华为OJ训练一
1 问题描述: 我们知道人民币有1,2,5,10,20,50,100这几种面值,现在给你n(1<=n<=250)元让你计算换成用上面这些面额表示且总数不超过100张,共有几种。比如4元,能用4张1元、2张1元和1张2元、2张2元,三种表示方法。 输入有多组,每组一行,为一个集合n,输入以0结束 输出该面值有几种表示方法.输入输出实例:input: 1 4 0原创 2016-08-10 13:22:33 · 577 阅读 · 0 评论 -
剑指offer-树
#include<iostream>#include<algorithm>#include<queue>#include<stack>using namespace std;struct BinaryTreeNode{ int data; BinaryTreeNode *left; BinaryTreeNode *right;};BinaryTreeNode原创 2016-08-30 13:09:55 · 244 阅读 · 0 评论 -
动态规划和贪心算法问题(一)
1.动态规划问题 1.1书面意思 应用于子问题重叠的情况,即不同的子问题具有公共的子子问题。动态规划算法对每个子子问题只求解一次,将其解保存到一个表格中,从而无需每次求解一个子问题时都重新计算,避免了这种不必要的工作。 动态规划方法通常用来求解最优化问题,这类问题可以有很多可行解,每个解都有一个值,我们希望寻找具有最优值的解。设计动态规划算法步骤: (1) 刻画一个最优解的结构特征 (2)原创 2016-07-13 17:05:38 · 1110 阅读 · 0 评论 -
动态规划和贪心算法问题(应用篇)
1 0-1背包问题(腾讯2014年笔试) “背包题目”的基本描述是:有一个背包,能盛放的物品总重量为S,设有N件物品,其重量分别为w1,w2,…,wn,希望从N件物品中选择若干物品,所选物品的重量之和恰能放进该背包,即所选物品的重量之和即是S。递归和非递归解法都能求得“背包题目”的一组解,试写出“背包题目”的非递归解法。#include<iostream>#include<string原创 2016-07-14 10:44:03 · 624 阅读 · 0 评论 -
字符串组合问题
1.对于给定的字符串,求出所有的排列组合方式 思路:例如,对于“abc”,先确定以a开头,只需要考虑bc的顺序,递归进去求bc的子问题 再交换a和b以b开头得到“bac”,只需考虑ac的顺序,递归求解ac的子问题 最后以c开头,求解ab的顺序,递归求解ab的子问题 注意:在程序实现时,每次确定交换打头的字符后必须原创 2016-07-14 22:26:26 · 338 阅读 · 0 评论 -
图论算法
1.DFS和BFS算法 思考:DFS可以用栈来实现,BFS可以用队列来实现。比较简单,就直接上代码。#include<iostream>#include<string>#include<algorithm>#include<stack>#include<queue>using namespace std;#define VEXNUM 5class Graph{public原创 2016-07-15 10:34:34 · 384 阅读 · 0 评论 -
剑指offer-链表
单向链表的结构定义typedef int DataType; struct ListNode{ DataType value; ListNode *next;}问题1、往链表的末尾添加一个结点//给定头结点,往末尾插入一个结点void InsertNode(ListNode **head,DataType key){ ListNode *q=new ListNode;原创 2016-08-29 22:23:34 · 464 阅读 · 0 评论 -
单例设计模式
设计一个类,只能实现该类的一个实例! 1 使用C++实现一个懒加载的单例class Singleton{public: static Singleton GetInstance(){ if(instance==NULL) instance=new Singleton(); return instance; }private原创 2016-08-08 23:02:33 · 191 阅读 · 0 评论 -
递归算法的应用(迷宫)
题目:给定一个m*n的迷宫,找到任意两个点之间的路径!如图所示 这是一个10*10的矩阵,标记为0的代表不可以走,1代表可以走,找出起点(1,1)到终点(8,8)的路径。解题思路:对于任何一个位置(i,j),下一步共有4个方向可以选择,包括向上(i-1,j),向下(i+1,j),向左(i,j-1),向右(i,j+1);走过的点必须标记出来,避免下一次重新走,如果走到某个位置走不通了,必原创 2016-08-09 10:30:01 · 2905 阅读 · 1 评论 -
华为OJ相关算法
1、合唱队问题 给定一个身高数组,从里面抽出若干人之后,使之保持身高由小到大,再从大到小的合唱队队形,求出至少出队的人数! 解题思路:必须得考虑清楚每一个位置左边递增的人数和右边递减的人数,两者的最大和即为最长的合唱队人数。所以可以两次遍历数组,求最长递增(减)子序列即可。关于最长递增子序列的问题我们已经很熟悉了。下面直接码上代码已经相关过程解析。#include<iostrea原创 2016-08-09 15:09:15 · 840 阅读 · 0 评论 -
图论算法
问题1、图的邻接矩阵表示法#define MAXSIZE 100 //定义最大顶点个数typedef char VertexType; //顶点的类型struct Graph{ VertexType Vertex[MAXSIZE]; //顶点 int AdjMatrix[MAXSIZE][MAXSIZE];//两个顶点之间的权重 int vexnum; /原创 2016-09-05 14:38:24 · 685 阅读 · 0 评论