算法、数据结构
摸金青年v
帮助值得帮助的人
展开
-
Leetcode第1题 两数之和twoSum
Leetcode的两数之和的两道题,和HashMap和双指针两种方法。题目描述:给定一个整数数组nums和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例: 给定 nums = [2, 7, 11, 15], target = 9因为 n...原创 2019-04-20 19:06:19 · 353 阅读 · 0 评论 -
剑指offer 第17题 树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val...转载 2019-06-09 12:40:36 · 162 阅读 · 0 评论 -
剑指offer 第20题 栈中所含最小元素
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。思路:用一个栈存放最小值,始终保持最小的在栈顶import java.util.Stack;public class Solution { private Stack<Integer> dataStack = new Stack&l...转载 2019-06-09 12:59:45 · 189 阅读 · 0 评论 -
剑指offer 第21题 栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路:利用栈,弹出时比较是否相等就可以import java.util....转载 2019-06-09 13:07:00 · 160 阅读 · 0 评论 -
剑指offer 第22题 从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。解题思路使用队列来进行层次遍历。不需要使用两个队列分别存储当前层的节点和下一层的节点,因为在开始遍历一层的节点时,当前队列中的节点数就是当前层的节点数,只要控制遍历这么多节点数,就能保证这次遍历的都是当前层的节点。转载:import java.util.ArrayList;import java.util.Q...转载 2019-06-09 13:09:48 · 165 阅读 · 0 评论 -
剑指offer 第23题 二叉树后序遍历
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路:采用分治法的思想,找到根结点、左子树的序列、右子树的序列,分别判断左右子序列是否为二叉树的后序序列。转发https://www.nowcoder.com/questionTerminal/a861533d45854474ac791d90...转载 2019-06-09 13:46:37 · 164 阅读 · 0 评论 -
剑指offer 第28题 数组中出现次数超过一半的数字 JAVAb版
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路:多数投票问题,可以利用 Boyer-Moore Majority Vote Algorithm 来解决这个问题,使得时间复杂度为 O(N)。使用 cnt 来...转载 2019-06-09 13:55:03 · 137 阅读 · 0 评论 -
剑指offer 第30题 连续数组的最大和
题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序...转载 2019-06-09 14:02:41 · 137 阅读 · 0 评论 -
剑指offer 第1题 二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:从左下角元素往上查找,右边元素是比这个元素大,上边是的元素比这个元素小。于是,target比这个元素小就往上找,比这个元素大就往右找。如果出了边界,则说明二维数组中不存在target元素...原创 2019-06-03 18:12:30 · 136 阅读 · 0 评论 -
剑指offer 第3题 从尾到头打印链表 java版
题目:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。思路:借助堆栈的“后进先出”/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;* ...原创 2019-06-03 18:38:30 · 161 阅读 · 0 评论 -
剑指offer 第10题 矩形覆盖 斐波那契数列
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法转载:https://www.nowcoder.com/questionTerminal/72a5a919508a4251859fb2cfb987a0e6(1)当 n < 1时,显然不需要用2*1块覆盖,按照题目提示应该返回0。(2)当...转载 2019-06-03 21:42:54 · 202 阅读 · 0 评论 -
剑指offer 第13题 调整数组顺序使奇数偶数相对位置不变
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路:快速排序不稳定,不能保证相对位置不变,插入排序稳定时间是O(n^2)所以新开数组空间换时间的解法, a.遍历数组,如果是奇数从头部放入到原数组中,并记录指针 b.如果是偶数,放入到新...转载 2019-06-04 12:48:13 · 245 阅读 · 0 评论 -
剑指offer 第15题 反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。思路:依次遍历所有节点,将所有节点的next指向前一个节点不同于 剑指offer 第3题 从尾到头打印链表https://blog.csdn.net/sinat_41144773/article/details/90756895题目:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。思路:借助堆栈的“后进...转载 2019-06-05 09:08:03 · 135 阅读 · 0 评论 -
快速排序的非递归实现(利用栈)
快速排序递归算法使用的栈由程序自动产生,栈中包含:函数调用时的参数和函数中的局部变量。如果局部变量很多或者函数内部又调用了其他函数,则栈会很大。每次递归调用都要操作很大的栈,效率自然会下降。 非递归算法程序员手动利用栈来存储每次分块快排的起始点,栈非空时循环获取中轴入栈。package sort;import java.util.Objects;import java.util.S...转载 2019-06-12 10:54:41 · 2616 阅读 · 0 评论 -
给定一个矩阵m*n,从左上角开始每次只能向右或者向下走,最后到右下角的位置共有多少种路径
题目描述 给定一个矩阵m*n,从左上角开始每次只能向右或者向下走,最后到右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和。思路:1、排列组合 要从A到B,必须向左走6步,向下也走6步,一共12步,我们可以从向下走入手,向下走的方法即从12步里选出6步向下,一共有C(12,6)种,因此从A到B的路线共有组合数C(12,6)种。...转载 2019-07-01 07:40:14 · 25734 阅读 · 4 评论 -
输出连续最长的数字串 Java实现
题目描述:输出字符串中连续最长数字串,条件如果两个串相同大小输出后者考察点:1、string判断是否是数字的方法(ASCII)2、用两个字符串缓存最大值,和长串覆盖短串3、考察几个判定条件(max置空的时机)4、(鲁棒性高)特殊情况:结尾就是数字,或结尾有一个字母,结尾有多个字母的情况都要保证算法可行!class Untitled { public static v...原创 2019-07-15 22:25:08 · 835 阅读 · 0 评论 -
剑指offer 第16题 合并两个排序链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路:新建一个head节点(新链表),链表1和链表2比较,值小的加入新链表若链表比较之后有剩下的,直接加入新链表尾部/*public class ListNode { int val; ListNode next = null; ListNode(...转载 2019-06-09 12:27:36 · 145 阅读 · 0 评论 -
散列表HashTable、HashMap的常见问题及底层(源码分析)
散列表(HashTable、HashMap) 散列表,也称哈希表(HashTable)是一种数组+链表的数据结构(拉链法),解决hash冲突。 Hash冲突:key-value的结构,key的hash值可能会相同产生冲突(不能放在同一个数组位置上) 所以用拉链法放将冲突到链表里,为了保证哈希表查找容易,希望链表不要太长,冲突分布均匀...原创 2019-03-03 09:18:01 · 912 阅读 · 0 评论 -
Leetcode第3题 不重复最长子串
题目描述:给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。示例1:输入: "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是"abc",所以其长度为 3。示例 2: 输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是"b",所以其长度为 1。示例 3:输入: "pwwkew"输出: 3解释: 因为无重...原创 2019-04-20 19:12:38 · 217 阅读 · 0 评论 -
Leetcode第5题 最长回文子串
题目描述:给定一个字符串s,找到s中最长的回文子串。你可以假设s的最大长度为 1000。示例 1:输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案。示例 2:输入: "cbbd"输出: "bb"‘’解题思路:动态规划DP public String longestPalindrome(String s) {...原创 2019-04-20 19:27:49 · 227 阅读 · 0 评论 -
Leetcode第26题 删除排序数组中的重复项
题目描述:给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。示例1:给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。你不需要考虑数组中超出新长度后面的元素。示...原创 2019-04-20 20:24:27 · 116 阅读 · 0 评论 -
Leetcode第14题 最长公共前缀
题目描述:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串""。示例1:输入: ["flower","flow","flight"] 输出: "fl"示例2:输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。说明:所有输入只包含小写字母a-z。解题思路: 分治法引用官方...转载 2019-04-20 20:51:13 · 221 阅读 · 0 评论 -
剑指offer 第7-9题 跳台阶 斐波那契数列问题
爬楼梯、跳台阶、变态跳台阶等问题都属于 “斐波那契数列” 问题,常采用动态规划解决。题目描述:假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定n是一个正整数。解题思路:动态规划DP public int climbStairs(int n) { if (n == 1) {...原创 2019-04-20 21:07:05 · 209 阅读 · 0 评论 -
Leetcode第83题 删除排序链表中的重复元素
题目描述:给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。示例1:输入: 1->1->2输出: 1->2示例2:输入: 1->1->2->3->3输出: 1->2->3、解题思路:这是一个简单的问题,仅测试你操作列表的结点指针的能力。由于输入的列表已排序, 因此我们可以通过将结点的值与它之后...原创 2019-04-20 21:22:49 · 152 阅读 · 0 评论 -
Leetcode第101题 对称二叉树
题目描述:给定一个二叉树,检查它是否是镜像对称的。例如,二叉树[1,2,2,3,4,4,3]是对称的。s 1 / \ 2 2 / \ / \3 4 4 3但是下面这个[1,2,2,null,3,null,3]则不是镜像对称的: 1 / \ 2 2 \ \ 3 3说明:如果你可以运用递...原创 2019-04-20 21:26:39 · 126 阅读 · 0 评论 -
Leetcode第121题 买卖股票的最佳时机
题目描述:给定一个数组,它的第i个元素是一支给定股票第i天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。注意你不能在买入股票前卖出股票。示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1...原创 2019-04-20 21:34:36 · 215 阅读 · 0 评论 -
快速排序、堆排序过程原理(Java实现)
快速排序原理: 选择基准值一般选择序列的第一个元素,比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边。一次循环:从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果没有继续比较下一个,直到找到第一个比基准值小的值才交换。找到这个值之后,又从前往后开始比较,如果有比基准值大的,交换位置,如果没有继续比较下一个,直到找到第一个比基准值大的值才交换。引...原创 2019-04-21 21:05:41 · 512 阅读 · 0 评论 -
排序算法原理,时间复杂度,实现过程详解
主要几种排序算法的思维导图1、直接插入排序 从第一个数开始依次向它的前一个数比较,如果这个数大,则将之前的数向后移位(每次排序会需要移动很多其他的数)/** * 直接插入排序的原理 */public class InsertSort { public static void main(String []args){ int[] a =...原创 2019-04-30 15:40:17 · 584 阅读 · 0 评论 -
经典算法之动态规划、分治、和贪心
1、分治 分治(即分而治之),把一个复杂的问题分成多个相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。 适用场景:二分搜索、归并排序、快速排序、大整数乘法、第K小元素、最近点对、快速傅里叶变换等。2、动态规划 动态规划法也是把问题一层一层地分解为规模逐渐减小的同类型的子问题。动态规...转载 2019-04-30 17:01:19 · 1133 阅读 · 0 评论 -
剑指offer 第5题 两个栈实现队列Java版
实现思路:用栈1(stack1)来实现队列的入队push操作(数据存在stack1),用stack2来实现队列的pop操作,将stack1的数据全部压入stack2,数据从stack2弹出实现队列的pop操作。转载:https://blog.csdn.net/qq_23217629/article/details/51723295import java.util.Stack...转载 2019-06-01 06:50:24 · 126 阅读 · 0 评论 -
二叉查找树,平衡二叉树,B树,红黑树(图解)
1、二叉查找树二叉查找树BST(binary search/sort tree)又叫二叉搜索树或者二叉排序树,它首先是一个二叉树,而且必须满足下面的条件:1)若左子树不空,则左子树上所有结点的值均小于它的根节点的值(左小)2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值(右大)3)左、右子树也分别为二叉排序树2、平衡二叉树平衡二叉树(AVL树),又称自平衡...原创 2019-04-28 09:27:07 · 1826 阅读 · 0 评论 -
树、二叉树(完全二叉树、满二叉树)概念图解
1、树的定义树是n个结点的有限集合,有且仅有一个根结点,其余结点可分为m个根结点的子树。2、树的概念结点的度:一个结点拥有子树的个数称为度。比如A的度为3,C的度为2,H的度为0。度为0的结点称为叶子节点(D,F,G,H)。树的度是树中所有结点的度的最大值,此树的度为3。 树中结点的最大层次成为树的深度或高度。此树的深度为4。 父节点A的子结点B,C,D;B,C,D也是兄弟节点...原创 2019-04-26 10:08:13 · 82551 阅读 · 14 评论 -
剑指offer 第14题 输出该链表中倒数第k个结点(java)
题目描述:输入一个链表,输出该链表中倒数第k个结点。思路:双指针,p指针先跑,并且记录节点数,当p指针跑了k-1个节点后,pre指针开始跑, 当p指针跑到最后时,pre所指指针就是倒数第k个节点/*public class ListNode { int val; ListNode next = null; ListNode(int va...转载 2019-06-02 10:19:50 · 118 阅读 · 0 评论 -
java版,用最少数量的货币买价格为m的商品,最大货币面额为1,2,3....最大面额n
第一题 不同面额货币购物问题题目:用最少数量的货币买价格为m的商品,最大货币面额为1,2,3....最大面额n测试样例: //面额最大为4块的货币买18元的商品,用了5个货币输入: 4 18输出:5解题思路:m/n的除数就是货币数,定义一个count做累加。然后将余数赋值给m,继续m/n到m==0,但是n最大面额值变下一个n--import java.util.Scanner;...原创 2019-08-26 06:38:01 · 817 阅读 · 0 评论