贪心算法

前置知识

const Greedy = num => {
//贪心
let arr = [100, 20, 10, 5, 2, 1]
let count = 0;
for (let i = 0; i < arr.length; i++) {
let use = Math.floor(num / arr[i])
count += use;
num = num - arr[i] * use
console.log('需要面额为' + arr[i] + '有' + count + '张')
count = 0;
}
}
Greedy(120)

一群孩子吃糖果

// 孩子,糖果,
const findContent = (g, s) => {
g.sort()
s.sort()
let child = 0;
let cookie = 0;
while (child < g.length && cookie < s.length) {
if (g[child] <= s[cookie]) {
child++
}
cookie++;//无论成功或者失败,每个糖果只尝试一次,cookie向后移动
}
return child
}
let g = [2, 4, 5, 6, 7]
let s = [1, 3, 4, 6, 7]
console.log(findContent(g, s))

摇摆序列(LeetCode376)

举例子

[1,17,5,10,13,15,10,5,16,8]

​ [5,10,13,15] 属于递增序列

也就是[小大小大...]或者[大小大小...]

求最长的摇摆序列

const wiggleMax = nums => {
let n = nums.length
if (n < 2) {
return n
}
let up = 1;
let down = 1;
for (let i = 1; i <n ; i++) {
if (nums[i] > nums[i - 1]) {
up=down+1;
}
if (nums[i] < nums[i - 1]) {
down=up+1;
}
}
return Math.max(up, down)
}
console.log(wiggleMax([1, 17, 5, 10, 13, 15, 10, 5, 16, 8,1,9]))

402移掉k位数字

给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小

初始化一个栈

记得打断点就懂了

class Stack {
constructor() {
this.items = []
} push(element) {
this.items.push(element)
} //移除栈中的元素,遵循先进后出原则
pop() {
return this.items.pop()
} //返回栈顶
peek() {
return this.items[this.items.length - 1]
} //判断栈是否为空,为空为true,不为空为false
isEmpty() {
return this.items.length == 0
} size() {
return this.items.length
} //清除栈
clear() {
this.items = [];
} print() {
console.log(this.items)
}
}
const removeK = (num, k) => {
//存在的栈
const stack = new Stack();
//贪心算法+栈
if (k >= num.length || num.length == 0) return '0';
//栈顶始终是最大值
stack.push(+num.charAt(0));
for (let i = 1; i < num.length; i++) {
let now = +num.charAt(i);
//当前栈不为空的时候,而且k>0,当前值小于栈顶,就删除栈中的一个元素
while (!stack.isEmpty() && k > 0 && now < stack.peek()) {
stack.pop();
k--;
}
//不等于0可以添加进去,
//等于0,栈不为空可以填进去,
if (now != 0 || !stack.isEmpty()) {
stack.push(now);
}
}
//56789去掉后面添加的个人
while (k > 0) {
k--;
stack.pop();
}
//10,1(当now=0时,满足条件,去掉1,但now为0,且为空。)
if (stack.isEmpty()) {
return '0';
}
//把栈中元素放到数组中
let sb = [];
while (!stack.isEmpty()) {
sb.push(stack.pop());
}
//还原成字符串
let sub = '';
sb.reverse().map(val => sub += val)
return sub
}
console.log(removeK('9234567', 3))

跳跃游戏

给出一个非负整数数组,你最初定位在数组的第一个位置。

数组中的每个元素代表你在那个位置可以跳跃的最大长度。

判断你是否能到达数组的最后一个位置。

样例

A = [2,3,1,1,4],返回 true.

A = [3,2,1,0,4],返回 false.

const canJump = maxSteps => {
if (maxSteps == null || maxSteps.length == 0) {
return false;
}
let meetIndex = maxSteps.length - 1;
for (let i = maxSteps.length - 1; i >= 0; i--) {
if (i + maxSteps[i] >= meetIndex) {
meetIndex = i;
}
}
return meetIndex == 0;
}
console.log(canJump([0,2,0,1,4]))

C++基础

>> 赋值

<< 打印

-> .

直方图中最大矩形面积

const getAnswer = h => {
let n = h.length;
let ans = 0;
for (let i = 1; i < n; i++) {
let a = Infinity;
for (let j = i; j < n; j++) {
a = Math.min(a, h[j])
ans = Math.max(ans, (j - i + 1) * a)
}
}
return ans
}
console.log(getAnswer([1, 8, 3, 4, 8]))

请n项的和

递归版

const sum2=num=>{
if (num < 1) {
return 0
}
return sum2(num-1)+num
}
console.log(sum2(100))

非递归版

const sum1=n=>{
let result=0;
for (let i = 0; i <=n; i++) {
result+=i;
}
return result
}
console.log(sum1(100))

线性表

顺序存储是顺序表

链表是线性表的链式存储方式,不连续的

-数据的元素|下一个元素的地址

字符串

字符串的存储可以使用顺序存储和链式存储两种方式

BF算法: BF是蛮力,暴力穷举

BF算法 O(m*n)

const BF = (s, t, pos) => {
let i = pos,
j = 1,
sum = 0;
let slen = s.length
let tlen = s.length
while (i <= slen && j <= tlen) {
sum++
//如果相等,则继续比较后面的字符
if (s[i - 1] == t[j - 1]) {
i++
j++
} else {
//i回退到上一轮开始比较的下一个字符
i = i - j + 2
//j回退到第1个字符
j = 1;
}
}
return '一共比较了' + sum + '次' }
console.log(BF('abcbcd', 'bcd', 0))

KMP算法 O(n+m)

使用动态规划解决

真前缀 除了自身以外,一个字符串的全部头部组合

后前缀 除了自身之外,一个字符串的全部尾部组合

动画

算出最长公共前后缀的长度(重复的长度)

开始比较(把数组下标为3的向前走一位)

写的很乱,现在重新分析下

移动的位数=匹配的字符数-对应的部分匹配值 //4-3=1 ,移动一位

我们算算匹配表的分解,p表示前缀,n表示后缀,r表示结果

a,         p=>0, n=>0  r = 0

aa,        p=>[a],n=>[a] , r = a.length => 1

aar,       p=>[a,aa], n=>[r,ar]  ,r = 0

aaro,      p=>[a,aa,aar], n=>[o,ra,aro] ,r = 0

aaron      p=>[a,aa,aar,aaro], n=>[n,on,ron,aron] ,r = 0

aarona,    p=>[a,aa,aar,aaro,aaron], n=>[a,na,ona,rona,arona] ,r = a.lenght = 1

aaronaa,   p=>[a,aa,aar,aaro,aaron,aarona], n=>[a,aa,naa,onaa,ronaa,aronaa] ,  r = Math.max(a.length,aa.length) = 2

aaronaac   p=>[a,aa,aar,aaro,aaron,aarona], n=>[c,ac,aac,naac,onaac,ronaac]  r = 0

终于找到了看着比较舒服的完整代码了,不多说直接上代码

const getNext = str => {
let next = [-1]
let k = -1
for (let i = 1; i < str.length; i++) {
//第一次不执行且从前缀开始,判断不同的把-1赋值上
while (k != -1 && str[k + 1] != str[i]) {
k = next[k]
}
//然后判断相同的,让k自增
if (str[k + 1] == str[i]) {
k++
}
//这是最开始将k赋值到数组中,然后依次判断把值赋值上
next[i] = k
}
return next
} const KMP = (str1, str2) => {
let next = getNext(str2)
let j = 0 for (let i = 0; i < str1.length; i++) {
while (j > 0 && str1[i] != str2[j]) {
j = next[j - 1] + 1 // j 更新为最长可匹配前缀子串的长度 k
}
if (str1[i] == str2[j]) j++
if (j == str2.length) return i - str2.length + 1
}
return -1
}
console.log(KMP('abcdacbcdababc', 'ababc'))

##########################..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

算法(贪心|BF|KMP)的更多相关文章

  1. 串的两种模式匹配方式(BF/KMP算法)

    前言 串,又称作字符串,它是由0个或者多个字符所组成的有限序列,串同样可以采用顺序存储和链式存储两种方式进行存储,在主串中查找定位子串问题(模式匹配)是串中最重要的操作之一,而不同的算法实现有着不同的 ...

  2. 算法起步之kmp算法

    [作者Idlear  博客:http://blog.csdn.net/idlear/article/details/19555905]            这估计是算法连载文章的最后几篇了,马上就要 ...

  3. 数据结构学习之字符串匹配算法(BF||KMP)

    数据结构学习之字符串匹配算法(BF||KMP) 0x1 实验目的 ​ 通过实验深入了解字符串常用的匹配算法(BF暴力匹配.KMP.优化KMP算法)思想. 0x2 实验要求 ​ 编写出BF暴力匹配.KM ...

  4. 算法系列:kmp

    作者: 阮一峰 日期: 2013年5月 1日 字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另 ...

  5. 浅谈Manacher算法与扩展KMP之间的联系

    首先,在谈到Manacher算法之前,我们先来看一个小问题:给定一个字符串S,求该字符串的最长回文子串的长度.对于该问题的求解.网上解法颇多.时间复杂度也不尽同样,这里列述几种常见的解法. 解法一   ...

  6. 算法笔记之KMP算法

    本文是<算法笔记>KMP算法章节的阅读笔记,文中主要内容来源于<算法笔记>.本文主要介绍了next数组.KMP算法及其应用以及对KMP算法的优化. KMP算法主要用于解决字符串 ...

  7. 第4章学习小结_串(BF&KMP算法)、数组(三元组)

    这一章学习之后,我想对串这个部分写一下我的总结体会. 串也有顺序和链式两种存储结构,但大多采用顺序存储结构比较方便.字符串定义可以用字符数组比如:char c[10];也可以用C++中定义一个字符串s ...

  8. 字符串匹配常见算法(BF,RK,KMP,BM,Sunday)

    今日了解了一下字符串匹配的各种方法. 并对sundaysearch算法实现并且单元. 字符串匹配算法,是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目.此算法通常输入为原字符串(strin ...

  9. 常用算法3 - 字符串查找/模式匹配算法(BF & KMP算法)

    相信我们都有在linux下查找文本内容的经历,比如当我们使用vim查找文本文件中的某个字或者某段话时,Linux很快做出反应并给出相应结果,特别方便快捷! 那么,我们有木有想过linux是如何在浩如烟 ...

随机推荐

  1. C# - VS2019 WinFrm应用程序连接Access数据库,并简单实现数据库表的数据查询、显示

    序言 众所周知,Oracle数据库和MySQL数据库一般在大型项目中使用,在某些小型项目中Access数据库使用较为方便,今天记录一下VS2019 WinFrm应用程序连接Access数据库,并实现数 ...

  2. YII 项目部署时, 显示空白内容

    本地开发完成,想部署到服务器上,选用了GIT来在服务器上获取上传的本地项目,结果clone后,访问网址后,YII就是个空白页,啥信息也没有,无语.. 刚开始以为是权限问题,后来给访问的目录加了777, ...

  3. RabbitMQ、RPC、SaltStack "贡"具的使用

    消息队列 使用队列的场景 在程序系统中,例如外卖系统,订单系统,库存系统,优先级较高 发红包,发邮件,发短信,app消息推送等任务优先级很低,很适合交给消息队列去处理,以便于程序系统更快的处理其他请求 ...

  4. vue中利用Promise封装jsonp并调取数据

    Promise就是一个给一步操作提供的容器,在这个容器里,有两个阶段无法改变的阶段,第一个阶段就是Pending(进行),第二个阶段就是结果阶段,包含Fulfilled(成功).Rejected(失败 ...

  5. ElasticSearch最全分词器比较及使用方法

    介绍:ElasticSearch 是一个基于 Lucene 的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口.Elasticsearch 是用 Java 开 ...

  6. Python 报错 MySQLdb._exceptions.OperationalError: (2059, )

    Python连接MySQL数据时:报错提示MySQLdb._exceptions.OperationalError: (2059, <NULL>). Python包: mysqlclien ...

  7. linux ptrace I【转】

    转自:https://www.cnblogs.com/mmmmar/p/6040325.html 这几天通过<游戏安全——手游安全技术入门这本书>了解到linux系统中ptrace()这个 ...

  8. JS高阶---继承模式(借用构造函数继承+组合继承)

    (1)借用构造函数继承 案例如下: 验证: (2)组合继承 案例如下: 验证如下: 结果如右图所示 . .

  9. php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)

    php.mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳) //其中 video 是表名: //createtime 是字段: // //数据库time字段为时间戳 // //查询当天: ...

  10. 201871010133-赵永军《面向对象程序设计(java)》第十一周学习总结

    201871010133-赵永军<面向对象程序设计(java)>第十一周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...