java
Lucky_Go
这个作者很懒,什么都没留下…
展开
-
剑指Offer[38]:字符串的排列
题目输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc, acb, bac, bca, cab和cba。题目来源于牛客网,对剑指Offer书中字符串排列问题做了小小修改,也就是需要按字典序打印出所有的排列。也就是说两个字符排列需要根据从左到右逐个比较对应的字符的先后来确定先后顺序。...转载 2020-02-20 18:05:23 · 246 阅读 · 0 评论 -
LeetCode-最长回文子串
题目链接:最长回文子串给定一个字符串 s,找到 s 中最长的回文子串。解法一:暴力解法暴力解法就是判断原字符串的每一个substring是不是回文串,返回最长的回文子串。暴力解法的时间复杂度为O(n3)O(n^3)O(n3)。解法二:最长公共子串回文串的定义——正着和反着读一样。那么把原来的字符串 s 反过来得到 reverse_s,找到它们的最长公共子串是不是就是满足条件的回文子串...转载 2020-01-08 23:10:41 · 222 阅读 · 0 评论 -
剑指Offer[31]:栈的压入、弹出序列
题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。LeetCode中也有相同的题目:验证栈序列解决思路 直观的想法就是构建一个栈,将第一个序列按顺序压入栈中,压入同时判断能否按照第二个序列的顺序弹出。整理一下这个思路,步骤如下:依次将第一个序列的元素压入栈中;判断这个元素是不是第二个序列中的将要pop的值;如...原创 2019-10-28 11:30:41 · 147 阅读 · 0 评论 -
二叉查找树的基本实现
定义数组和链表数组和链表是两种使用频率非常高的数据结构,但两者的结构也决定了他们的应用场景。数组的元素在内存中的地址是连续的,而构成链表的结点在内存中的地址不连续,数组的元素可以通过索引进行随机访问,链表则需要遍历访问,因此数组的查询速度比链表快;另一方面链表的长度可变,插入和删除元素的效率非常高,因此在增删操作较多的情况下链表性能比数组好。二叉查找树二叉查找树(Binary Se...原创 2019-09-26 16:53:33 · 423 阅读 · 0 评论 -
剑指Offer[24]:反转链表
题目 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。我们将链表的节点定义如下:class ListNode{ private int val; // 节点值 private ListNode next; // 下一个节点} LeetCode中也有相应的题目解法迭代解法 迭代的方法很好理解:为了反转链表我们从前向后遍历链表,改变...原创 2019-09-18 22:18:22 · 133 阅读 · 0 评论 -
剑指Offer[16]:数值的整数次方
题目 实现函数 double Power(double base, int exponent), 求base的exponent次方,不使用库函数,同时不需要考虑大数问题。分析 书中作者已经分析的很清楚了,主要有两个方面去考虑:指数(exponent)为0和负数的情况;求解的效率问题。 第一个方面是容易被忽略的,还有需要考虑底数为0时指数小于等于0是没有意义的;第二个方面就是...原创 2019-09-18 22:16:27 · 156 阅读 · 0 评论 -
二分查找的递归和迭代实现
基本思想 在一个数组中查找某个特定元素的时候,直观的方法就是从头开始向后进行遍历。但是,如果数组一开始就是有序的,那么我们就可以有更快的查找方式——二分查找。二分查找是二分法思想的一个典型应用,具体来说,对于一个有序数组,我们如果要查找一个元素,那么首先用数组的中间元素将数组切分为两部分,若带查找元素大于中间元素则在前一部分找,小于则在后一部分找……以此不断地切分数组搜索待查找元素。 二分...原创 2019-09-16 21:22:57 · 632 阅读 · 0 评论 -
十大排序算法总结(附java实现)
定义 排序 是计算机内部经常进行的一项操作,目的是将一组无序的序列调整为一组有序的序列。Excel中将数据按照名称进行升序降序排列就是一种常见的排序操作。相关概念时间复杂度:反映操作次数(计算量)随数据长度的变化规律,是数据规模的函数,用O(⋅)O(·)O(⋅)表示。空间复杂度:用来度量执行算法所需的存储空间随数据规模的变化情况,也用O(⋅)O(·)O(⋅)表示。稳定性:对于两个相等...原创 2019-09-12 21:05:38 · 152 阅读 · 0 评论 -
排序算法(8):计数排序/桶排序/基数排序
计数排序、桶排序和基数排序是三个线性时间非比较类排序算法,他们相同的特点在于不是通过比较元素的大小来确定他们的排列顺序,并且均能够达到线性时间复杂度O(n+k)O(n+k)O(n+k),之所以这样根本在于他们都使用了额外的桶(bucket, 不是某种特定数据结构,只是一种叫法)来辅助存储数据。但是这三种排序算法的应用场景都比较有限,下面具体来讲一下这三种排序算法。计数排序基本思想 以一...原创 2019-09-12 21:02:11 · 321 阅读 · 0 评论 -
排序算法(7):堆排序
基本思想 堆排序是基于堆这种数据结构的一种排序方法。首先将待排序的数组(或序列)构造成完全二叉树,然后利用完全二叉树中父节点和孩子节点之间的关系,每次从当前二叉树中找出最大节点并将其移出未排序部分,达到排序的目的。首先介绍一下一些相关概念:完全二叉树:对于一棵深度为 hhh 的二叉树,如果除了最后一层外,其他每层的节点数都达到最大,且第 hhh 层的节点都连续集中在最左边,那么这就是一棵...原创 2019-09-12 20:58:51 · 511 阅读 · 0 评论 -
排序算法(6):快速排序
基本思想 快速排序也是一种基于分治的排序算法,它的主要思想是将一个数组切分成两部分,将这两部分独立的进行排序。和归并排序不同的是:归并排序首先对两部分子数组进行排序,在子数组各自有序之后将他们合并为一个完整的有序数组;而快速排序在两个子数组均有序的时候整个数组也已经有序了。 快速排序的关键在于对数组的切分,这个过程通过一个切分元素(或者叫基准)来实现的,切分将数组划分为两部分,满足前一部分...原创 2019-09-12 20:57:15 · 459 阅读 · 0 评论 -
排序算法(5):归并排序
基本思想 用一句话描述归并排序就是:将两个有序的数组归并(Merge)为一个有序数组。归并排序是分治思想的一种典型应用。归并排序可以通过自顶向下的方式实现,也可以通过自底向上的方式实现。自顶向下自顶向下的归并排序首先将数组分成两个子数组,分别递归调用这两部分进行单独排序,最后合并子数组。下面的动图演示就是自顶向下的归并排序。自底向上和自顶向下的归并排序化整为零的思路不同,自底向...原创 2019-09-12 20:54:40 · 234 阅读 · 0 评论 -
排序算法(4):希尔排序
基本思想h有序数组一个数组中任意间隔为 hhh 的元素都是有序的,那这个数组就是h有序数组。如下图所示这个数组就是一个 hhh 有序数组,其中 h=4h=4h=4。可以看到,虽然整个数组是乱序的,但任意相隔 h=4h=4h=4 的元素都是有序的。希尔排序希尔排序的思想就是,首先让数组 hhh 有序,然后不断减小 hhh 的值。试想一下,当 h=1h=1h=1 的时候,数组 hh...原创 2019-09-12 20:52:41 · 405 阅读 · 0 评论 -
排序算法(3):插入排序
基本思想 在玩扑克牌的时候,每当抽到一张牌的时候,就将其插入到手中已经有序的拍中,插入排序和这种整理扑克牌的思路很像。每遍历到一个新的元素就将其插入到它之前的所有元素中的合适位置,保证其之前的序列有序。算法流程第一趟排序:将第二个元素插入到前一个元素的合适位置;第二趟排序:将第三个元素插入到前两个元素中的正确位置;第三趟排序:将第四个元素插入到前三个元素中的正确位置;……第 nn...原创 2019-09-12 20:49:22 · 170 阅读 · 0 评论 -
排序算法(2):冒泡排序
基本思想 冒泡排序是基于比较和交换的排序算法。它重复地比较两两元素,如果他们顺序错误就进行交换,直到没有交换发生表明数组已经有序。 之所以称为冒泡排序是因为在比较排序过程中,较小的元素会慢慢的前移,类似于碳酸饮料中二氧化碳的气泡上浮过程。算法流程比较相邻元素,如果第一个元素比第二个元素大则交换它们的位置;从开始第一对到最后一对的每一对相邻元素做步骤1同样的工作,这一步之后最后一个元...原创 2019-08-21 20:04:32 · 424 阅读 · 0 评论 -
排序算法(1):简单选择排序
基本思想 简单选择排序是一种简单并且非常直观的排序算法。它的思想是每次从未排序序列中找到最小值,然后将其放到已排序序列的末尾,重复这一过程直到不存在未排序元素。算法流程以长度为 nnn 的数组为例:第一趟排序:从第一个元素开始遍历整个数组,找出最小值,和第一个元素交换;第二趟排序:找出第二个元素到第 nnn 个元素中的最小值,和第二个元素交换;第三趟排序:找出第三个元素到...原创 2019-08-21 11:30:02 · 2031 阅读 · 1 评论 -
回环变位(Circular Rotation)
回环变位:如果字符串s中的字符循环移动任意位置之后能够得到另一个字符串 t,那么 s 称为 t 的回环变位(Circular Rotation)。例如,”ACTGACG” 就是 “TGACGAC” 的一个回环变位。一般的实现思想 利用循环的方式遍历字符串t,从循环次数i处将字符串t分成两个字串后交换顺序拼接成一个新的字符串,比较新的s和新的字符串是否相等。public static boole原创 2018-05-10 22:38:53 · 802 阅读 · 0 评论