算法
「已注销」
stay hungry stay foolish
展开
-
求排列A',使得advantage(A',B)最大
(这道题目是在不知道起个什么名字好,就把题中关键的内容作为题目了)题目给定两个长度相等都为n的数组A和数组B,定义advantage(A,B)等于A[i]>B[i]元素的个数,要求写一个enhance函数,输入A,B,返回一个排列A',使得advantage(A',B)最大,并给出时间复杂度。举例1A=【2,7,11,15】,B=【1,10,4,11】则advantage...原创 2018-11-26 16:53:06 · 440 阅读 · 0 评论 -
希尔排序(java实现)
思路 算法属性 代码思路希尔排序是插入排序的加强版,算法最开始以一定的步长进行排序,然后会继续以更小的步长进行排序,最终算法以步长为 1 进行排序。当步长为 1 时,算法变为直接插入排序,这就保证了数据一定会被全部排序。算法属性排序类型 时间复杂度(平均) 时间复杂度(最坏) 时间复杂度(最好) 空间复杂度 稳定性 复杂性 交换排序...原创 2018-11-27 11:19:38 · 145 阅读 · 0 评论 -
插入排序(java实现)
思路 算法属性 代码(未优化) 代码(优化)思路从第一个元素开始,该元素可以认为已经被排序; 取出下一个元素,在已经排序的元素序列中从后向前扫描; 如果该元素(已排序)大于新元素,将该元素移到下一个位置; 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置; 将新元素插入到该位置后; 重复步骤2-5算法属性排序类型 时间复杂度(平均) 时间复杂度...原创 2018-11-27 10:54:26 · 138 阅读 · 0 评论 -
冒泡排序(java实现)
思路 算法属性 代码(未优化) 代码(优化)思路冒泡排序是一种交换排序。(两两比较待排序的关键字,并交换不满足次序要求的那对数,直到整个表都满足次序要求为止。)冒泡排序就是要每趟排序过程中通过两两比较相邻元素,将小的数字放到前面,大的数字放在后面。算法属性排序类型 时间复杂度(平均) 时间复杂度(最坏) 时间复杂度(最好) 空间复杂度 稳定性 ...原创 2018-11-27 09:33:30 · 165 阅读 · 0 评论 -
leetcode206. 反转链表(java实现)
题目:反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL核心思路:让当前节点的下个指针指向前节点算法//迭代/** * Definition for singly-linked list. * public class ListNode { *...原创 2018-12-14 15:16:49 · 381 阅读 · 0 评论 -
LeetCode52. 最大子序和(动态规划)
给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释:连续子数组[4,-1,2,1] 的和最大,为6。(如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。)方法:暴力解法,直接三层循环;(略) 动态规划:设sum[i]为以...转载 2018-09-10 17:42:16 · 207 阅读 · 0 评论 -
LeetCode72. 编辑距离(动态规划)
给定两个单词word1 和word2,计算出将word1转换成word2 所使用的最少操作数。你可以对一个单词进行如下三种操作:插入一个字符 删除一个字符 替换一个字符示例:输入: word1 = "horse", word2 = "ros"输出: 3解释:horse -> rorse (将 'h' 替换为 'r')rorse -> rose (删除 ...转载 2018-09-10 15:23:24 · 194 阅读 · 0 评论 -
LeetCode2. 两数相加
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。实例:输入:(2 -> 4 ->3)+(5 -> 6 ->4)输出:7 -> 0 -> 8原因:342+465=807思路:相加实际上是两个表的表头开始...转载 2018-09-10 09:37:12 · 192 阅读 · 0 评论 -
LeetCode9. 回文数字
题目 思路(两种) 代码(两种)题目判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。实例: 输入 输出 样例1 121 true 样例1 -121 false 样例3 10 false 思路思路1:首先排除负数,其次,将数字转化为字符串,对比字符串前半部分和后半部分,如果相等...转载 2018-09-09 22:56:31 · 513 阅读 · 0 评论 -
LeetCode326. 3的幂
给定一个整数,写一个函数来判断它是否是 3的幂次方。实例:输入:3输出:true输入:27输出:true输入:45输出:false进阶:你能不使用循环或者递归来完成本题吗?一般情况下我们一定会用循环来除以3取余,但是进阶要求不用循环或者递归,就得换一个思路了。因为给的数字是int,3^19是 int里 3的幂次方中最大的,只需要3^19%n来判断你是不是3的...转载 2018-09-09 22:34:34 · 129 阅读 · 0 评论 -
LeetCode204. 计算质数
统计所有小于非负整数n的质数的数量。示例:输入: 10 输出: 4解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。一般方法是写一个判断质数的方法,然后循环这个方法来统计质数的数量。下面介绍一个更好的方法:定义一个布尔数组boolean[] nums,里面初始值都是false,利用index和boolean对应,把所有的质数=fa...转载 2018-09-09 22:15:27 · 793 阅读 · 0 评论 -
快速排序(java实现)
思路 算法属性 代码思路参考文章及其动图展示快排链接:【点我】通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都是比它大的数。然后再按此方法对这两部分数据分别进行快速排序,整个排序过程递归进行,以此达到整个数据变成有序序列。division方法:把整个序列看做一个数组,把第零个位置看做中轴,和最后一个比,如果比它小交换,比它大不做任何处理;交换了...原创 2018-11-27 13:23:59 · 176 阅读 · 0 评论 -
选择排序(java实现)
思路 算法属性 代码思路从待排序序列中,找到关键字最小的元素; 将其和第一个元素互换; 从余下的N - 1个元素中,重复(1)、(2)步,直到排序结束。算法属性算则排序法的比较次数与序列的初始排序无关。假设待排序的序列有N个元素,则比较次数总是N (N - 1) / 2。简单选择排序需要占用1个临时空间,用于保存最小值得索引。排序类型 时间复杂...原创 2018-11-27 23:19:08 · 126 阅读 · 0 评论 -
牛顿迭代法求平方根
牛顿迭代法求平方根(这种算法的原理很简单,我们仅仅是不断用(x,f(x))的切线来逼近方程x^2-a=0的根。根号a实际上就是x^2-a=0的一个正实根,这个函数的导数是2x。也就是说,函数上任一点(x,f(x))处的切线斜率是2x。那么,x-f(x)/(2x)就是一个比x更接近的近似值。代入f(x)=x^2-a得到x-(x^2-a)/(2x),也就是(x+a/x)/2。)public ...原创 2018-10-19 08:54:31 · 653 阅读 · 0 评论 -
最长公共子串与最长公共子序列(动归实现)
什么是子序列?一个给定的序列的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果。什么是子串?给定串中任意个连续的字符组成的子序列称为该串的子串。(相对于子序列,子串是连续的)如abcdefacd是子序列。bcd是子串。最长公共子序列代码: public static int str(String s1, String s2) { int len1 = s1....原创 2018-10-20 21:01:41 · 150 阅读 · 0 评论 -
最小路径和(动归实现)
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例:输入:[ [1,3,1], [1,5,1], [4,2,1]]输出: 7解释: 因为路径 1→3→1→1→1 的总和最小。递推公式:dp[i][j] = grid[i][j] + min(dp[i - 1][j], ...转载 2018-10-20 22:00:45 · 204 阅读 · 0 评论 -
《社交网络》里的数学公式elo rating system埃洛等级分系统(java实现)
之前看过电影社交网络,里边的一个算法很吸引我,也可以说是一个数学公式,于是就用java实现了一下。除此,我还利用这个算法,做了一个应用,用于选出我喜欢的音乐等等.可以查看我的github[https://github.com/Imfondof/andorid_easyRank], 也可以下载这个手机app【https://github.com/Imfondof/andorid_easyR...原创 2018-12-22 10:45:53 · 1645 阅读 · 0 评论 -
java二分查找
查看二分查找的变种,移步文章【你真的会写二分查找吗】二分查找就是将查找的键和子数组的中间键作比较:如果被查找的键小于中间键,就在左子数组继续查找; 如果大于中间键,就在右子数组中查找, 否则中间键就是要找的元素。public class BinarySearch { public static void main(String[] args) { int[] list = {...转载 2018-12-19 11:27:09 · 218 阅读 · 0 评论 -
八大排序
这段时间整理了一下八大排序算法,这里做一些总结。期间参考的文章有:【静默虚空文章——数据结构和算法系列】 【Jack Cui——八大排序算法】 【简约人生的博客——八大排序算法】关于稳定性俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = Aj, Ai原来在Aj位置前,排序后Ai还是要在Aj位置前。八大算...原创 2018-11-28 17:10:33 · 201 阅读 · 0 评论 -
基数排序(java实现)
思路 算法属性 代码思路将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。 从最低位开始,依次进行一次排序。 这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。算...原创 2018-11-28 15:43:43 · 215 阅读 · 0 评论 -
归并排序(java实现)
思路 算法属性 代码思路分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。分阶段:可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可以理解为就是递归拆分子序列的过程,递归深度为log2...原创 2018-11-28 13:11:37 · 133 阅读 · 0 评论 -
堆排序(java实现)
思路 算法属性 代码思路参考文章及其动图展示快排链接:【点我】(堆是一棵顺序存储的完全二叉树。其中每个结点的关键字都不大于其孩子结点的关键字,这样的堆称为小根堆。其中每个结点的关键字都不小于其孩子结点的关键字,这样的堆称为大根堆。)根据初始数组去构造初始大根堆(构建一个完全二叉树,保证所有的父结点都比它的孩子结点数值大)。(循环n/2次,因为最后一个非叶子结点是第⌊n/2⌋...原创 2018-11-28 11:31:52 · 152 阅读 · 0 评论 -
LeedCode172. 阶乘后的零
给定一个整数 n,返回 n! 结果尾数中零的数量(说明: 你算法的时间复杂度应为O(logn)。)示例 1:输入: 3输出: 0解释: 3! = 6, 尾数中没有零。观察发现规律:题目让我们找末尾0的数量,只有当有10的出现才会有0,比如2*5=10,4*5=20,5*8=40等等,所以这道题是在让我们求n里边有多少个5(关键点:0和5的联系)代码:class S...转载 2018-09-09 21:34:57 · 101 阅读 · 0 评论