高效算法设计
曾卫
笃信科技引领金融的理念践行者,成为国际领先的个人金融生活服务提供商的推动者,目前上海财经大学研究生在读。
展开
-
求递增最长子序列-非动态规划方式
求递增最长子序列-非动态规划方式实现解题思路演示过程代码实现打印效果学习Java的同学注意了!!!学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:543120397 我们一起学Java!需求描述:给定一个int数组,【0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15】,求所有的递增最长子序列。解题思路1.从最后索引位置,往前遍历。2.每遍历一个元素,汇总当前组最长递增子序列。3.所有循环结束后,再原创 2020-12-25 14:32:14 · 266 阅读 · 0 评论 -
最优组合算法
最优组合算法算法实现输出结果学习Java的同学注意了!!!学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:543120397 我们一起学Java!需求:1.目标数组 {10,6,5,3,10,2,1,1,6,1,1}2.要求组合不能大于10,且组合最小算法实现/** * @Description: 最优组合算法 * @Author zengwei * @Date 2020-11-03-18:32 **/public class TheBest原创 2020-11-04 15:41:37 · 2996 阅读 · 0 评论 -
游戏与算法的必经之路
前言作为一个在IT行业工作十五年的老兵,笔者在这里将自己多年的学习游戏算法经验分享给读者,希望能够帮助那些想学习算法提升自己的读者。算法是IT产品研发的核心,在IT的任何领域都离不开算法,目前比较流行的IT领域有:大数据,人工智能,深度学习,游戏开发,虚拟现实,增强现实等,这些领域的核心都是算法,可见算法在IT领域的重要性。本文主要聚焦游戏算法,游戏开发不外乎3D引擎接口调用和游戏逻辑编写转载 2016-12-30 14:27:27 · 378 阅读 · 0 评论 -
算法基础:Stack堆栈的应用
业务部分Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, *, /. Each operand may be an integer or another expression. For example: ["2", "1", "+", "3", "原创 2017-07-03 17:56:33 · 343 阅读 · 0 评论 -
Java数据结构与算法解析(一)——表
[-]表的概述Java Collection Api中的表实现一个ArrayList实现LinkedList本节我们讨论常见常用的数据结构——表。 如果要通俗简单的说什么是表,那我们可以这样说:按顺序排好的元素集合就是表。表的概述抽象数据类型是带有一组操作的一些对象的结合1、定义: 线性表是一个线性结构,它是一个含有n≥0个结点的有限转载 2017-08-31 22:34:09 · 299 阅读 · 0 评论 -
判断单向链表中是否有环和查找环的入口
快慢指针算法描述定义两个指针slow, fast。slow指针一次走1个结点,fast指针一次走2个结点。如果链表中有环,那么慢指针一定会再某一个时刻追上快指针(slow == fast)。如果没有环,则快指针会第一个走到NULL。实现结点定义如下:class Node { public Node next; public Object data转载 2018-01-22 22:58:41 · 223 阅读 · 0 评论 -
java 单向和双向链表的详解
Java 链表的使用浅谈自己学习链表之后的理解:链表是一种重要的数据结构,有单链表和双链表之分单链表(单向链表):由两部分组成 数据域(Data)和结点域(Node),单链表就像是一条打了很多结的绳子,每一个绳结相当于一个结点,每个节结点间都有绳子连接,这样原理的实现是通过Node结点区的头指针head实现的,每个结点都有一个指针,每个节点指针的指向都是指向自身结点的下一个转载 2018-01-22 23:00:52 · 2410 阅读 · 0 评论 -
动态分配解决回文数问题
业务需求:Leetcode – Longest Palindromic Substring (Java)Finding the longest palindromic substring is a classic problem of coding interview. This post summarizes 3 different solutions for this proble原创 2017-07-03 18:00:26 · 296 阅读 · 0 评论 -
程序员必须知道的10大基础实用算法及其讲解
算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序n个项目要Ο(nlogn)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(nlogn)算法更快,因为它的内部循环(innerloop)可以在大部分的架构上很有效率地被实现出来。 快速排序使用分治法(Divideandconquer)策略来把一个串行(li...转载 2018-08-10 14:47:26 · 295 阅读 · 0 评论 -
算法工程师:双非渣硕是如何获得百度、京东双SP
算法工程师:双非渣硕是如何获得百度、京东双SP 本人本科硕士皆双非,和牛客大佬们没得比,目前拿到的还可以的offer就是百度SP和京东SP,都是做的推荐算法,其他的不说了。 先说一下个人经历吧,学校比较水,实验室没有项目,实习经历:腾讯实习+滴滴实习 比赛经历:几个数据挖掘竞赛Top5的名次。 个人感觉,算法岗确...转载 2018-09-28 17:55:08 · 956 阅读 · 0 评论 -
算法设计方法:递归的内涵与经典应用
算法设计方法:递归的内涵与经典应用摘要: 大师 L. Peter Deutsch 说过:To Iterate is Human, to Recurse, Divine.中文译为:人理解迭代,神理解递归。毋庸置疑地,递归确实是一个奇妙的思维方式。对一些简单的递归问题,我们总是惊叹于递归描述问题的能力和编写代码的简洁,但要想真正领悟递归的精髓、灵活地运用递归思想来解决问题却并不是一件容易的事情。...转载 2018-10-29 16:22:47 · 197 阅读 · 0 评论 -
二叉搜索树的平衡--AVL树和树的旋转(图解)
二叉搜索树的平衡–AVL树和树的旋转(图解)二叉搜索树只有保持平衡时其查找效率才会高要保持二叉搜索树的平衡不是一件易事。不过还是有一些非常经典的办法可以做到,其中最好的方法就是将二叉搜索树实现为AVL树。AVL树得名于它的发明者 G.M. Adelson-Velsky 和 E.M. Landis,他们在 1962 年的论文 “An algorithm for the organizat...转载 2018-11-30 15:50:00 · 388 阅读 · 0 评论 -
两篇文章教会你看先序遍历、中序遍历、后续遍历
两篇文章教会你看先序遍历、中序遍历、后续遍历对于树相关的处理,一直都存在困惑,这两篇文档基本帮我解惑,特此记录,供以后学习使用。https://jingyan.baidu.com/article/cdddd41cb8d79753ca00e144.htmlhttps://blog.csdn.net/qq_33243189/article/details/80222629...转载 2018-11-30 16:57:46 · 243 阅读 · 0 评论 -
编程时避免使用 if 语句的五种模式
编程时避免使用 if 语句的五种模式大约十年前,我听说了反if的活动,觉得这个概念非常荒谬。如果不用if语句,又怎么能写出有用的程序呢?这简直太荒谬了。但之后你会开始思考:是否还记得上周你拼命想读懂的深度嵌套代码?糟透了对么?要是有办法能简化它该多好。反if活动的网站上没给出多少实用性建议,因此在本文中,作者将会提供一系列模式,也许你会用得上。但首先我们来关注一下if语转载 2016-11-02 20:29:57 · 488 阅读 · 0 评论 -
每个程序员都应该收藏的算法复杂度速查表
算法复杂度这件事这篇文章覆盖了计算机科学里面常见算法的时间和空间的大 OBig-O 复杂度。我之前在参加面试前,经常需要花费很多时间从互联网上查找各种搜索和排序算法的优劣,以便我在面试时不会被问住。最近这几年,我面试了几家硅谷的初创企业和一些更大一些的公司,如 Yahoo、eBay、LinkedIn 和 Google,每次我都需要准备这个,我就在问自己,“为什么没有人创建一个漂亮的大 O转载 2016-08-10 15:26:34 · 318 阅读 · 0 评论 -
Java排序算法(一):概述
Java排序算法(一):概述排序是程序开发中一种非常常见的操作,对一组任意的数据元素(或记录)经过排序操作后,就可以把他们变成一组按关键字排序的有序队列。对一个排序算法来说,一般从下面3个方面来衡量算法的优劣:时间复杂度:它主要是分析关键字的比较次数和记录的移动次数。空间复杂度:分析排序算法中需要多少辅助内存。稳定性:若两个记录A和B的关键字值相等,但是排序后A,B的先后次转载 2014-09-28 12:29:22 · 444 阅读 · 0 评论 -
Java排序算法(九):归并排序
Java排序算法(九):归并排序归并排序(Merge)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有转载 2014-09-28 12:23:31 · 430 阅读 · 0 评论 -
Java排序算法(十一):基数排序 .
Java排序算法(十一):基数排序基数排序已经不再是一种常规的排序方式,它更多地像一种排序方法的应用,基数排序必须依赖于另外的排序方法。基数排序的总体思路就是将待排序数据拆分成多个关键字进行排序,也就是说,基数排序的实质是多关键字排序。多关键字排序的思路是将待排数据里德排序关键字拆分成多个排序关键字;第1个排序关键字,第2个排序关键字,第3个排序关键字......然后,根据子关键字对待排序转载 2014-09-28 12:44:06 · 473 阅读 · 0 评论 -
Java排序算法(二):直接选择排序 .
Java排序算法(二):直接选择排序直接选择排序的基本操作就是每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完,它需要经过n-1趟比较。算法不稳定,O(1)的额外的空间,比较的时间复杂度为O(n^2),交换的时间复杂度为O(n),并不是自适应的。在大多数情况下都不推荐使用。只有在希望减少交换次数的情况下可以用。基本思转载 2014-09-28 12:29:10 · 477 阅读 · 0 评论 -
Java排序算法(十):桶式排序 .
Java排序算法(十):桶式排序桶式排序不再是一种基于比较的排序方法,它是一种比较巧妙的排序方式,但这种排序方式需要待排序的序列满足以下两个特征:待排序列所有的值处于一个可枚举的范围之类;待排序列所在的这个可枚举的范围不应该太大,否则排序开销太大。排序的具体步骤如下:(1)对于这个可枚举范围构建一个buckets数组,用于记录“落入”每个桶中元素的个数;(2)将(1)中得到转载 2014-09-28 12:43:21 · 527 阅读 · 0 评论 -
Java排序算法(五):快速排序 .
Java排序算法(五):快速排序快速排序是一个速度非常快的交换排序算法,它的基本思路很简单,从待排的数据序列中任取一个数据(如第一个数据)作为分界值,所有比它小的数据元素放到左边,所有比它大的数据元素放到它的右边。经过这样一趟下来,该序列形成左右两个子序列,左边序列中的数据元素的值都比分界值小,右边序列中数据元素的值都比分界值大。接下来对左右两个子序列进行递归排序,对两个子序列重新选择中心转载 2014-09-28 12:36:56 · 474 阅读 · 2 评论 -
Java排序算法(八):希尔排序(Shell排序) .
Java排序算法(八):希尔排序(Shell排序)希尔排序(缩小增量法) 属于插入类排序,由Shell提出,希尔排序对直接插入排序进行了简单的改进:它通过加大插入排序中元素之间的间隔,并在这些有间隔的元素中进行插入排序,从而使数据项大跨度地移动,当这些数据项排过一趟序之后,希尔排序算法减小数据项的间隔再进行排序,依次进行下去,进行这些排序时的数据项之间的间隔被称为增量,习惯上用字母h来表示转载 2014-09-28 12:41:30 · 473 阅读 · 0 评论 -
Java排序算法(三):堆排序 .
Java排序算法(三):堆排序堆积排序(Heapsort)是指利用堆积树(堆)这种资料结构所设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素。堆排序是不稳定的排序方法,辅助空间为O(1), 最坏时间复杂度为O(nlog2n) ,堆排序的堆序的平均性能较接近于最坏性能。 堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最转载 2014-09-28 12:32:17 · 430 阅读 · 0 评论 -
Java排序算法(十二):总结 .
Java排序算法(十二):总结前面讲了10种基本的排序算法,现在来作下总结,基于下面几个方面来比较各个排序算法的优劣:时间复杂度,空间复杂度,稳定性,适用场景排序算法时间复杂度空间复杂度稳定性适用场景直接选择排序O(n^2)O(1)不稳定时间效率不高,但是空间效率很高,算法实现比较简单堆排序O(nlogn),底数为转载 2014-09-28 12:45:25 · 468 阅读 · 0 评论 -
Java排序算法(七):折半插入排序 .
Java排序算法(七):折半插入排序折半插入排序法,又称二分插入排序法,是直接插入排序法的改良版,也需要执行i-1趟插入,不同之处在于,第i趟插入,先找出第i+1个元素应该插入的的位置,假定前i个数据是已经处于有序状态。代码实现:[java] view plaincopyprint?package sort; public class BinaryInse转载 2014-09-28 12:38:56 · 436 阅读 · 0 评论 -
Java排序算法(十三):补充-洗牌算法 .
Java排序算法(十三):补充-洗牌算法这个算法的要求是这样的:将N个数乱序后输出.由于和扑克牌的洗牌过程比较相似所以我也就称为洗牌算法了.很多地方都不自觉的需要这个算法的支持.也可以将这个算法扩展为从N个数中取出M个不重复的数(0思路:有n个数据的数据列,从第一个元素开始,随机取出数据列中元素与之交换,依次进行n次交换,即可得到一个随机排列的数据列代码实现: [j转载 2014-09-28 12:44:21 · 875 阅读 · 0 评论 -
Java排序算法(六):直接插入排序 .
Java排序算法(六):直接插入排序直接插入排序的基本操作就是将待排序的数据元素按其关键字值的大小插入到前面的有序序列中。直接插入的时间效率并不高,如果在最坏的情况下,所有元素的比较次数总和为(0+1+...+n-1)=O(n^2)。其他情况下也要考虑移动元素的次数,故时间复杂度为O(n^2)直接插入空间效率很好,只需要1个缓存数据单元,也就是说空间复杂度为O(1).转载 2014-09-28 12:38:17 · 465 阅读 · 0 评论 -
Java排序算法(四):冒泡排序 .
Java排序算法(四):冒泡排序冒泡排序是计算机的一种排序方法,它的时间复杂度为O(n^2),虽然不及堆排序、快速排序的O(nlogn,底数为2),但是有两个优点:1.“编程复杂度”很低,很容易写出代码;2.具有稳定性,这里的稳定性是指原序列中相同元素的相对顺序仍然保持到排序后的序列,而堆排序、快速排序均不具有稳定性。不过,一路、二路归并排序、不平衡二叉树排序的速度转载 2014-09-28 12:35:18 · 501 阅读 · 0 评论 -
经典问题:百钱买百鸡
问题:用100元买100只鸡,大公鸡5元1只,母鸡3元1只,小鸡1元3只。问各能买多少只? 分析完后相当于求解下面的三元三次方程: i+3j+k/3=100 i+j+k=100; 程序如下:(暂时是最优)public class Test2 { public stati...原创 2014-09-19 12:19:15 · 957 阅读 · 0 评论