算法
Gpwner
这个作者很懒,什么都没留下…
展开
-
算法<改进的冒泡排序、直接插入排序、折半插入排序、希尔排序、快速排序、归并排序>
1.冒泡排序基本方法: 设待排序的序列中的元素个数为n,首先比较第N-2个元素和第N-1个元素,如果发生逆序则交换;然后对第N-3个元素和第N-2个元素做同样的处理;重复此过程直到处理完第0个元素和第一个元素。这样称为第一趟排序,第二趟排序从第N-2个元素和第N-3个元素开始做同样的操作,直到第零个元素和第一个元素。这样的排序需要N-1趟。 public static void bubb原创 2017-02-27 21:18:22 · 545 阅读 · 0 评论 -
「LEETCODE-1」两数之和
题目简介:解决思路:可借助“互补”概念来解决,遍历数组,当前元素如果不在词典镜像词典内,则将target-num 以及num对应的下标存入镜像中;如果在镜像中,则将当前下标与镜像中与当前数字“互补”的数字的下标返回。代码:class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]:...原创 2019-04-05 19:47:23 · 499 阅读 · 0 评论 -
算法<删除一个数组中为0的元素>
题目要求:给一个一维数组,将其中为0的元素删除掉,非零元素的相对位置保持不变,最终目标数组保留在原数组,目标长度之外的元素全部置为0。Given an array nums, write a function to move all 0's to the end of it while maintaining the relative order of the non-zero elements.F原创 2017-09-03 15:27:14 · 2148 阅读 · 0 评论 -
算法<Maximum Product Subarray>
题目的要求是求一个一维数组中子串的最大乘积,比如:Find the contiguous subarray within an array (containing at least one number) which has the largest product.For example, given the array [2,3,-2,4],the contiguous subarray [2,原创 2017-09-03 11:13:15 · 451 阅读 · 0 评论 -
算法<Best Time to Buy and Sell Stock>
算法的题目是这样的: 有一个一维数组,数组的下标表示日期,下标对应的元素为该日股票的价格,请设计一个算法来求出股票买入和卖出的最大收益。Example 1:Input: [7, 1, 5, 3, 6, 4]Output: 5max. difference = 6-1 = 5 (not 7-1 = 6, as selling price needs to be larger than buying原创 2017-09-02 22:33:46 · 497 阅读 · 0 评论 -
算法<求算数平方根>
使用代码完成求一个数的平方根这里只说牛顿迭代法: 计算x2 = n的解,令f(x)=x2-n,相当于求解f(x)=0的解,如左图所示。 首先取x0,如果x0不是解,做一个经过(x0,f(x0))这个点的切线,与x轴的交点为x1。 同样的道理,如果x1不是解,做一个经过(x1,f(x1))这个点的切线,与x轴的交点为x2。 以此类推。 以这样的方式得到的xi会无限趋近于f(x)=原创 2017-08-30 21:14:45 · 2564 阅读 · 0 评论 -
算法<Array Partition I>
这个题目的要求是给定一个数组,有2N个元素,将其划分为N对(每一对有两个元素),使得每一对中的最小的元素相加的总和最大,例如:有一个数组: s=a1+b1+a2+b2+a3+b(3)+…+an+bn;我们的目标是将数组划分诸如: (a1,b1),(a2,b2),(a3,b3),….(an,bn) 然后求: Sm = min(a1, b1) + min(a2, b2) + … + min(an原创 2017-09-03 19:16:13 · 474 阅读 · 0 评论 -
算法<基于三路划分的快速排序>
当待排序元素序列中有大量的重复排序码时,简单的快速排序算法的效率将会降到非常之低。一种直接的想法就是将待排序列分成三个子序列:一部分是排序码比基准元素排序码小的;一部分是与基准元素排序码等值的;一部分是比基准元素排序码大的,如下图所示: 但是,如果我们直接据此思想去编写实现算法的话,会让我们面临很大的困难。与基准元素等值的元素到底有多少?以及如何最快速有效地确定划分的边界?所以,完成这样的三路划分原创 2017-07-24 23:35:31 · 1565 阅读 · 0 评论 -
算法<Permutation Sequence>
问题描述:给定1-n个整数,将这N个数字做全排列,求第K个排列,结果用String形式返回。分析: 对于{1,2,3,4}的全排列来说,可以是: 1+{2,3,4}的全排列; 2+{1,3,4}的全排列; 3+{1,2,4}的全排列; 4+{1,2,3}的全排列;假如我们要求第十五个全排列,那么我们的流程应该是k=15-1i=1;14/3!=2=>数组{1,2,3,4}中第三个数字是3,原创 2017-07-22 22:50:21 · 430 阅读 · 0 评论 -
<算法>基于三路划分的链表快速排序
此算法基于三路划分的快速排序的思想,如果不懂请先看我之前的博客: http://blog.csdn.net/gpwner/article/details/76039533但是又不完全和之前将的三路划分完全一样下面开始进入正题: 首先得到一个链表之后,我们将链表拆分为小于、等于、大于头结点的子链表: 然后再递归调用算法,将小链表和大链表进行排序,最后再将链表连接成一个与原来的链表一样的链表。递归原创 2017-07-31 16:41:27 · 569 阅读 · 0 评论 -
算法<Next Permutation问题>
此问题描述如下: 给定一个数组,首先从后向前找出最长的递减序列的前一个元素,比如数组{1, 5, 8, 4, 7, 6, 5, 3, 1}中,从后向前最长递减序列是{ 7, 6, 5, 3, 1},这个序列的前一个元素就是4,然后再递减序列中找到最后一个比这个数(4)大的数字(就是5),然后将5与4交换,得到新的数组{1, 5, 8, 5, 7, 6, 4, 3, 1},然后将交换过后的递减序列进原创 2017-07-21 23:06:26 · 465 阅读 · 0 评论 -
算法<翻转链表的指定区间>
要求:翻转一个链表的指定区间,比如链表1->2->3->4->5,翻转第二个元素到第四个元素之后的新链表为:1->4->3->2->5思路:首先找到要翻转的第一个元素的前一个元素,比如现在我要翻转的区间是[2,4],那我首先要找到节点1。然后节点2置为翻转区间的头结点(在整个翻转过程中整个元素是不变的)。这里以翻转2、3节点为例子: 首先将节点1的next指针指向节点3,然后将节点2的next原创 2017-07-30 20:35:32 · 762 阅读 · 0 评论 -
算法<含相同元素数组的全排列>
可以借鉴我的上一篇博客(http://blog.csdn.net/gpwner/article/details/75212890)来简单得得到答案:import java.util.ArrayList;import java.util.List;import java.util.stream.Collectors;import java.util.stream.IntStream;/** *原创 2017-07-17 11:01:50 · 706 阅读 · 0 评论 -
算法<不含相同元素数组的全排列>
这里只考虑元素是各不相同的情况思路:全排列其实可以从前往后,分别将每一个数字与其后面的数字进行交换,从而得到所有的结果。比如由1,2,3可以得到1,2,3、2,1,3、3,2,1三种,然后有1,2,3可以得到1,2,3和1,3,2,依次类推。 化成图就是下面的结果: 代码如下:import java.util.ArrayList;import java.util.List;import ja原创 2017-07-16 22:53:56 · 673 阅读 · 0 评论 -
算法<异或操作交换两个数的坑>
相信大多数人能很快地写出交换两个数的代码,so easy: private static void swapTwoNum(int[] A, int i, int j) { System.out.println("交换前:" + A[i] + " " + A[j]); int temp = A[i]; A[i] = A[j]; A[j]原创 2017-07-16 22:02:08 · 777 阅读 · 0 评论 -
算法<递归与非递归方式翻转单链表>
链表的节点定义:public class ListNode { int val; ListNode next; ListNode(int x) { val = x; }}1.递归:public class Demo { public ListNode reverseList(ListNode head) { //当前节点翻转过原创 2017-07-14 23:26:40 · 479 阅读 · 0 评论 -
「LEETCODE-15」三数之和
题目简介:解题思路:a+b+c=0,无非有一下几种情况:1⃣️a,b,c三个数字有两个是相同的,相同的数字在数组中出现的次数必须大于1;2⃣️a为负数,b为正数数,c小于a或者c大于b;3⃣️c=0.(除此之外,之所以不考虑:负数<c<正数是因为恰恰这么做可以去除“重复的三元组”,比如[-3,-2,5],[-2,-3,5])代码:def threeSum(self, n...原创 2019-04-05 22:29:46 · 497 阅读 · 0 评论