数据结构与算法基础
数据结构与算法基础
小土狗一只
厚德载物
展开
-
JZ85 连续子数组的最大和(二)
JZ85 连续子数组的最大和(二)描述输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,找到一个具有最大和的连续子数组。1.子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组2.如果存在多个最大和的连续子数组,那么返回其中长度最长的,该题数据保证这个最长的只存在一个3.该题定义的子数组的最小长度为1,不存在为空的子数组,即不存在[]是某个数组的子数组4.返回的数组不计入空间复杂度计算数据范围:1&原创 2022-01-23 20:38:39 · 317 阅读 · 0 评论 -
折半(二分查找)中,使用int mid = low+((high-low)>>>1)的原因
public static int binSearch(int[] Array,int key){ int low = 0; int high = Array.length-1; while(low int mid = low+((high-low)>>>1); //右移一位,相当于除以2,但右移的原创 2017-08-25 09:42:16 · 7870 阅读 · 6 评论 -
数组分批算法(配合多线程一起使用)
/** * 数组分批算法 * @param list 数组 * @param listSize 分成的数组大小 * @return 等分好的List */private List<ArrayList<String>> getListSegment(List<String> list,int listSize) { //预设存数组的数组 List...原创 2018-12-08 18:15:29 · 719 阅读 · 0 评论 -
剑指20 - 包含min函数的栈
剑指20 - 包含min函数的栈定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。解法:import java.util.Stack;import java.util.Arrays;public class Solution { // 最小元素栈 Stack<Integer> minStack = new Stack<Integer>(); // 存放元素的数组,注意要使用Integer...原创 2021-03-03 23:31:31 · 94 阅读 · 1 评论 -
剑指21 - 栈的压入、弹出序列
剑指21 - 栈的压入、弹出序列题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)示例1输入[1,2,3,4,5],[4,3,5,1,2]返回值falseimport java.util.ArrayList;import jav原创 2021-03-03 23:32:54 · 103 阅读 · 1 评论 -
剑指17 - 树的子结构
剑指17 - 树的子结构题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)示例1输入{8,8,#,9,#,2,#,5},{8,9,#,2}返回值true编码:/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { th...原创 2021-03-02 21:38:59 · 83 阅读 · 0 评论 -
【证明+编码】把一根绳子剪成多段 并且使得每段的长度乘积最大
【证明+编码】把一根绳子剪成多段 并且使得每段的长度乘积最大1.待证明:尽可能多剪长度为 3 的绳子,并且不允许有长度为 1 的绳子出现。如果出现了,就从已经切好长度为 3 的绳子中拿出一段与长度为 1 的绳子重新组合,把它们切成两段长度为 2 的绳子。这样可以使乘积最大。假设:n为不需再分最小单元,那么对于任意整数x(1<x<n),都应该有以下公式成立 (n-x)*x - n < 0 // 即n不需要再分的时候,你对n还想再分,分出的数乘积应该小于不分的n nx...原创 2020-09-10 14:34:50 · 597 阅读 · 0 评论 -
算法题:假设一列火车一共经过10个车站,车站按顺序为 A B C D E F G H I J ,编写一个程序,自动计算剩余的票
假设一列火车一共经过10个车站,车站按顺序为 A B C D E F G H I J ,编写一个程序,自动计算剩余的票 要求:1 假设火车有100个座位 2.程序可以输入购买车票的起始站与结束站 3.输入后,程序输出剩余车票, 4.如剩余车票大于0,用户此时可以输入购买,购买后,车票减一, 5.依次循环 例如 输入 C...原创 2018-10-31 12:41:35 · 1148 阅读 · 0 评论 -
算法题:在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使计算结果为100,写出所有可能性。
算法题:在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100,写出所有的可能性。例如:1 + 2 + 34 – 5 + 67 – 8 + 9 = 100。JAVA写的程序如下,附结果。public class Test{ //先写一个计算器 public static int cal(String str) { List<...原创 2018-09-06 19:57:30 · 1658 阅读 · 0 评论 -
大数自增和打印
一、使用字符串实现public static void main(String[] args) { StringBuffer number = new StringBuffer("001"); while (!numberIncr(number)) { printNumber(number); }}private static boolean numberIncr(StringBuffer number) { int nLength = num...原创 2021-09-30 21:42:46 · 98 阅读 · 0 评论 -
LeetCode94 - 二叉树的中序遍历
LeetCode94 - 二叉树的中序遍历链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal给定一个二叉树的根节点 root ,返回它的 中序遍历。示例 1:输入:root = [1,null,2,3]输出:[1,3,2]示例 2:输入:root = []输出:[]示例 3:输入:root = [1]输出:[1]示例 4:输入:root = [1,2]输出:[2,1]时间复杂度:O(n.原创 2021-04-19 23:59:45 · 97 阅读 · 0 评论 -
LeetCode242 - 有效的字母异位词
LeetCode242 - 有效的字母异位词(难度:简单)链接:https://leetcode-cn.com/problems/valid-anagram给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。示例1:输入: s = "anagram", t = "nagaram"输出: true示例 2:输入: s = "rat", t = "car"输出: false说明:你可以假设字符串只包含小写字母。进阶:如果输入字符串包含 unicode.原创 2021-04-19 23:30:29 · 124 阅读 · 0 评论 -
LeetCode239 - 滑动窗口最大值
LeetCode239 - 滑动窗口最大值链接:https://leetcode-cn.com/problems/sliding-window-maximum给你一个整数数组 nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。示例 1:输入:nums = [1,3,-1,-3,5,3,6,7], k = 3输出:[3,3,5,5,6,7]解释:滑动窗口的位置 ...原创 2021-04-08 00:23:41 · 124 阅读 · 2 评论 -
LeetCode155 - 最小栈
LeetCode155 - 最小栈(难度:简单)链接:https://leetcode-cn.com/problems/min-stack设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop()—— 删除栈顶的元素。top()—— 获取栈顶元素。getMin() —— 检索栈中的最小元素。示例:输入:["MinStack","push","push","push","getMin","pop","..原创 2021-04-07 21:49:01 · 105 阅读 · 0 评论 -
LeetCode49 - 字母异位词分组
LeetCode49 - 字母异位词分组链接:https://leetcode-cn.com/problems/group-anagrams给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例:输入: ["eat", "tea", "tan", "ate", "nat", "bat"]输出:[ ["ate","eat","tea"], ["nat","tan"], ["bat"]]说明:所有输入均为小写字母。不考虑答案输出的顺序。...原创 2021-04-07 21:17:10 · 95 阅读 · 1 评论 -
LeetCode901 - 股票价格的跨度
LeetCode901 - 股票价格的跨度链接:https://leetcode-cn.com/problems/online-stock-span编写一个 StockSpanner 类,它收集某些股票的每日报价,并返回该股票当日价格的跨度。今天股票价格的跨度被定义为股票价格小于或等于今天价格的最大连续日数(从今天开始往回数,包括今天)。例如,如果未来7天股票的价格是 [100, 80, 60, 70, 60, 75, 85],那么股票跨度将是 [1, 1, 1, 2, 1, 4, 6]。示.原创 2021-04-06 23:11:38 · 185 阅读 · 0 评论 -
LeetCode122 - 买卖股票的最佳时机 II
LeetCode122 - 买卖股票的最佳时机 II链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii给定一个数组,它的第i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入: [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股.原创 2021-04-06 22:13:41 · 107 阅读 · 0 评论 -
LeetCode121 - 买卖股票的最佳时机
LeetCode121 - 买卖股票的最佳时机链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock给定一个数组 prices ,它的第i 个元素prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。示例 1:输入:[..原创 2021-04-06 21:49:59 · 134 阅读 · 0 评论 -
LeetCode739 - 每日温度
LeetCode739 - 每日温度链接:https://leetcode-cn.com/problems/daily-temperatures请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用0 来代替。例如,给定一个列表temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是[1, 1, 4, 2, 1, 1, 0, 0]。提示:气温 列表长度...原创 2021-04-06 21:00:22 · 190 阅读 · 0 评论 -
LeetCode42 - 接雨水
LeetCode42 - 接雨水(难度:困难)链接:https://leetcode-cn.com/problems/trapping-rain-water给定n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例 1:输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。.原创 2021-04-05 23:13:36 · 134 阅读 · 2 评论 -
LeetCode84 - 柱状图中最大的矩形
LeetCode84 - 柱状图中最大的矩形链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为[2,1,5,6,2,3]。图中阴影部分为所能勾勒出的最大矩形面积,其面积为10个单位。示例:输入: [2,1,5,...原创 2021-04-05 20:03:53 · 167 阅读 · 1 评论 -
LeetCode20 - 有效的括号
LeetCode20 - 有效的括号链接:https://leetcode-cn.com/problems/valid-parentheses给定一个只包括 '(',')','{','}','[',']'的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例 1:输入:s = "()"输出:true示例2:输入:s = "()[]{}"输出:true示例3:输入:s = "(]"输出:false...原创 2021-03-31 23:18:44 · 142 阅读 · 0 评论 -
LeetCode15 - 三数之和
LeetCode15 - 三数之和链接:https://leetcode-cn.com/problems/3sum给你一个包含 n 个整数的数组nums,判断nums中是否存在三个元素 a,b,c ,使得a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]示例 3:...原创 2021-03-31 22:33:53 · 102 阅读 · 0 评论 -
LeetCode1 - 两数之和
LeetCode1 - 两数之和链接:https://leetcode-cn.com/problems/two-sum给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。class Solution { public int[] twoSum(int[] nums, int target) { if(nums == n...原创 2021-03-30 09:33:40 · 97 阅读 · 0 评论 -
LeetCode142 - 环形链表2
LeetCode142 - 环形链表(中等)链接:https://leetcode-cn.com/problems/linked-list-cycle-ii/给定一个链表,判断链表中是否有环,无环则输出null;有环则输出环的入口点编码:/*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) {* ...原创 2021-03-29 23:21:00 · 136 阅读 · 0 评论 -
LeetCode141 - 环形链表1
LeetCode141 - 环形链表(简单)给定一个链表,判断链表中是否有环解法一、时间复杂度O(n),空间复杂度O(n)/*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) {* val = x;* next = null;* }* }*/p...原创 2021-03-29 23:19:15 · 135 阅读 · 1 评论 -
LeetCode25 - K 个一组翻转链表
LeetCode25 - K 个一组翻转链表链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group给你一个链表,每k个节点一组进行翻转,请你返回翻转后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有顺序。进阶:你可以设计一个只使用常数额外空间的算法来解决此问题吗?你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。示例 1:输入:head...原创 2021-03-26 12:14:50 · 91 阅读 · 0 评论 -
LeetCode24 - 两两交换链表中的节点
LeetCode24 - 两两交换链表中的节点(难度:中等)链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:输入:head = [1,2,3,4]输出:[2,1,4,3]示例 2:输入:head = []输出:[]示例 3:输入:head = [1]输出:[1]/*** De.原创 2021-03-25 22:29:11 · 118 阅读 · 0 评论 -
LeetCode283 - 移动零
LeetCode283 - 移动零(难度:简单)链接:https://leetcode-cn.com/problems/move-zeroes给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。解答:时间复杂度O(n),空间复杂度O(1)class Solution { public void..原创 2021-03-25 21:45:38 · 144 阅读 · 0 评论 -
LeetCode189 - 旋转数组
LeetCode189 - 旋转数组(难度:中等)链接:https://leetcode-cn.com/problems/rotate-array给定一个数组,将数组中的元素向右移动k个位置,其中k是非负数。进阶:尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。你可以使用空间复杂度为O(1) 的原地算法解决这个问题吗?示例 1:输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]解释:向右旋转 1 步...原创 2021-03-25 21:25:21 · 124 阅读 · 0 评论 -
LeetCode88 - 合并两个有序数组
LeetCode88 - 合并两个有序数组链接:https://leetcode-cn.com/problems/merge-sorted-array给你两个有序整数数组nums1 和 nums2,请你将 nums2 合并到nums1中,使 nums1 成为一个有序数组。初始化nums1 和 nums2 的元素数量分别为m 和 n 。你可以假设nums1 的空间大小等于m + n,这样它就有足够的空间保存来自 nums2 的元素。示例 1:输入:nums1 = [1,2,3,0...原创 2021-03-25 16:35:18 · 140 阅读 · 0 评论 -
LeetCode66 - 加一
LeetCode66 - 加一链接:https://leetcode-cn.com/problems/plus-one给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例1:输入:digits = [1,2,3]输出:[1,2,4]解释:输入数组表示数字 123。示例2:输入:digits = [4,3,2,1]输出:[4,3,2,...原创 2021-03-25 14:54:04 · 132 阅读 · 0 评论 -
LeetCode26 - 删除有序数组中的重复项
LeetCode26 - 删除有序数组中的重复项链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引用」方式传递的,这意味着原创 2021-03-25 11:54:18 · 414 阅读 · 0 评论 -
LeetCode11 - 盛最多水的容器
LeetCode11 - 盛最多水的容器链接:https://leetcode-cn.com/problems/container-with-most-water给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点(i,ai) 。在坐标内画 n 条垂直线,垂直线 i的两个端点分别为(i,ai) 和 (i, 0) 。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。示例 1:输入:[1,8,6,2,5,4,8,3,7]输出:49解释:图中垂...原创 2021-03-25 10:59:48 · 81 阅读 · 0 评论 -
剑指61 - 序列化二叉树
剑指61 - 序列化二叉树请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。例如,我们可以把一个只有根节点为1的二叉树序列原创 2021-03-24 15:03:36 · 92 阅读 · 0 评论 -
剑指66 - 机器人的运动范围
剑指66 - 机器人的运动范围地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?示例1输入5,10,10输出21public class Solution { public int ..原创 2021-03-24 10:31:14 · 119 阅读 · 0 评论 -
剑指65 - 矩阵中的路径
剑指65 - 矩阵中的路径请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如:a b c es f c sa d e e矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。示例1输入"ABC.原创 2021-03-24 09:46:34 · 105 阅读 · 0 评论 -
剑指64 - 滑动窗口的最大值
剑指64 - 滑动窗口的最大值给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5};针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1},{2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5]..原创 2021-03-22 23:07:08 · 115 阅读 · 0 评论 -
剑指63 - 数据流中的中位数
剑指63 - 数据流中的中位数如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。思路:为了保证插入新数据和取中位数的时间效率都高效,这里使用大顶堆+小顶堆的容器,并且满足:1、两个堆中的数据数目差不能超过1,这样可以使中位数只会出现在两个堆的交接处;2、大顶堆的原创 2021-03-22 22:26:21 · 87 阅读 · 0 评论 -
剑指58 - 判断是否是对称的二叉树
剑指58 - 判断是否是对称的二叉树请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。示例1输入{8,6,6,5,7,7,5}输出true示例2输入{8,6,9,5,7,7,5}输出false/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNo...原创 2021-03-21 21:48:48 · 91 阅读 · 0 评论