数据结构
文章平均质量分 60
何以解忧,唯有..
这个作者很懒,什么都没留下…
展开
-
Leetcode刷题之滑块窗口算法总结
一、基本概念滑动窗口指的是这样一类问题的求解方法,在数组上通过双指针同向移动而解决的一类问题。其实这样的问题我们可以不必为它们专门命名一个名字,它们的解法其实是很自然的。使用滑动窗口解决的问题通常是暴力解法的优化,掌握这一类问题最好的办法就是练习,然后思考清楚为什么可以使用滑动窗口。二、滑动窗口使用思路(寻找最长)核心:左右双指针(L、R)在起始点,R向右逐位滑动循环。每次移动过程中,如果窗内元素满足条件,R向右扩大窗口,并更新最优结果;如果元素不满足条件,L向右缩小窗口。R到达结尾结束。Leet原创 2022-02-20 23:19:28 · 471 阅读 · 0 评论 -
差分数组、前缀和
一、题目 —— Leetcode1109、航班预订统计二、思路 —— 差分数组+前缀和图解代码class Solution { public int[] corpFlightBookings(int[][] bookings, int n) { // 计算差分数组 int[] res = new int[n]; for (int[] booking:bookings) { res[booking[0]-1] += b原创 2022-02-15 23:15:40 · 383 阅读 · 0 评论 -
Leetcode -- 42.接雨水(困难)
一、题目接雨水给定 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 个单位的雨水(蓝色部分表示雨水)。示例 2:输入:height = [4,2,0,3,2,5]输出:9提示:n == height.length1 <= n &原创 2022-02-10 23:43:33 · 108 阅读 · 0 评论 -
LeetCode 单调栈练习题归纳总结
什么是单调栈?单调栈,栈内顺序要么从大到小 要么从小到大。一:739. 每日温度解题思路:遍历每日温度,维护一个单调栈,若栈为空或者当日温度小于、等于栈顶温度,则直接入栈;反之若当日温度大于栈顶温度,说明栈顶元素的升温日已经找到了,则将栈顶元素出栈,计算其与当日相差的天数即可。注意:题目要求返回的是升温的天数,而不是升温的温度,因此栈中保存的应是数组的下标,而非温度。代码:class Solution { public int[] dailyTemperatures(int[] te原创 2022-02-08 23:49:01 · 6322 阅读 · 0 评论 -
数据结构学习 —— 树
一、概念 —— 什么是树?在计算机科学中,树(英语:tree)是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:1、每个节点都只有有限个子节点或无子节点2、没有父节点的节点称为根节点3、每一个非根节点有且只有一个父节点4、除了根节点外,每个子节点可以分为多个不相交的子树5、树里面没有环路(cy原创 2022-01-28 23:10:38 · 762 阅读 · 0 评论 -
数据结构学习 —— 栈与队列
一、栈与队列 —— 概念解释栈:又称为后进先出(Last In First Out)的结构,简称LIFO机构。队列:又称为先进先出(First In First Out)的结构,简称FIFO结构。二、案例详解 —— 232. 用栈实现队列(简单)请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素in原创 2022-01-27 23:06:04 · 173 阅读 · 0 评论 -
动态规划解题思路总结归纳(二)
五、案例详解 —— 64. 最小路径和给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/minimum-path-sum/步骤一、定义数组元素的含义由于我们的目的是从左上角到右下角,最小路径和是多少,那我们就定义dp[i][j]的含义为:当机器人从左上角走到(i, j) 这个位置时,最小的路径和原创 2022-01-25 23:04:09 · 491 阅读 · 0 评论 -
动态规划解题思路总结归纳(一)
一、动态规划的三大步骤定义:动态规划,无非就是利用历史记录,来避免我们的重复计算。而这些历史记录,我们得需要一些变量来保存,一般是用一维数组或者二维数组来保存步骤一:定义数组元素含义,例如定义一个二维数组,dp[ ][ ],dp[ i ][ j ] 表示的具体含义;步骤二:找出数组元素之间的关系式,例如 dp[ i ][ j ] = dp[ i-1 ][ j ] + dp[ i ][ j -1] ,也就是可以利用历史数据来推出新的元素值,这个就是他们的关系式了。而这一步,也是最难的一步突破口。步原创 2022-01-23 23:24:59 · 2142 阅读 · 1 评论 -
LeetCode-5. 最长回文子串(字符串,中等难度),3种解法总结归纳
一、题目给你一个字符串 s,找到 s 中最长的回文子串。二、解题思路2.1、暴力求解法代码: public String longestPalindrome(String s) { int maxLen = 1, start = 0, len = s.length(); char[] chars = s.toCharArray(); if (s.length() < 2) { return s;原创 2022-01-20 00:04:23 · 511 阅读 · 0 评论 -
LeetCode-8. 字符串转换整数 (atoi)(字符串,中等难度)
一、题目请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数 myAtoi(string s) 的算法如下:读入字符串并丢弃无用的前导空格检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。将前面步骤读入的这些数字转换为整数(即,“1原创 2022-01-17 23:26:05 · 97 阅读 · 0 评论 -
LeetCode-3. 无重复字符的最长子串(字符串,中等难度)
一、题目给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。二、解题思路代码:class Solution { public int lengthOfLongestSubstring(String s) { int len = s.length(),result = 0; Map<Character,Integer> map = new HashMap(); char[] chars = s.toCharArra原创 2022-01-16 23:32:28 · 218 阅读 · 0 评论 -
LeetCode-2. 两数相加(链表,中等难度)
一、题目给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/add-two-numbers二、解题思路1、定义两个指针 root 和 curPoint,curPoint指向节点相加以后的节点,root.next为最终返原创 2022-01-15 21:41:36 · 160 阅读 · 0 评论 -
LeetCode-206 反转链表(链表)
一、题目给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。二、解题思路定义两个指针 prePoint = null 和 curPoint = head,开始依次向后遍历,并将 curPoint.next = prePoint,直至curPoint指向null。开始:结束:代码:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNod原创 2022-01-14 23:05:52 · 118 阅读 · 0 评论 -
LeetCode-160 相交链表(链表)
一、题目给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构 。自定义评测:评测系统 的输入如下(你设计的程序 不适用 此输入):intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0listA - 第一个链表listB - 第二个链表skipA -原创 2022-01-13 23:42:42 · 103 阅读 · 0 评论 -
LeetCode-141 环形链表(链表)
一、题目给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。链接:https://leetcode-cn.com/problems/lin原创 2022-01-12 23:14:53 · 166 阅读 · 0 评论 -
LeetCode-21 合并两个有序链表(链表)
一、题目将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]示例 2:输入:l1 = [], l2 = []输出:[]示例 3:输入:l1 = [], l2 = [0]输出:[0]提示:两个链表的节点数目范围是 [0, 50]-100 <= Node.val <= 100l1 和 l2 均按 非递减顺序 排列题目链接:https://原创 2022-01-11 22:53:56 · 209 阅读 · 0 评论 -
LeetCode-283移动零
一、题目给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:1、必须在原数组上操作,不能拷贝额外的数组。2、尽量减少操作次数。二、解题方法双指针解决,i 正常轮询数组,j 非零的数的下标代码:class Solution { public void moveZeroes(int[] nums) { int j = 0; for原创 2022-01-08 22:45:08 · 155 阅读 · 0 评论 -
LeetCode-88合并两个有序数组
一、题目合并两个有序数组给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。示例 1:输入:num原创 2022-01-08 20:40:47 · 68 阅读 · 0 评论 -
LeetCode-1两数之和
一、题目给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums = [3,2,4], targe原创 2022-01-08 15:59:47 · 71 阅读 · 0 评论 -
数据结构 —— 了解递归算法
一、什么是递归简单地说,就是如果在函数中存在着调用函数本身的情况,这种现象就叫递归。1、一个问题的解可以分解为几个子问题的解2、这个问题与分解之后的子问题,除了数据规模不同,求解的思路完全相同3、存在终止条件以阶层函数为例,如下, 在 factorial 函数中存在着 factorial(n - 1) 的调用,所以此函数是递归函数:public int factorial(int n) { if (n < =1) { return 1; } retu原创 2022-01-08 10:56:13 · 816 阅读 · 0 评论 -
数据结构学习——稀疏数组
数据结构包括:线性结构 和 非线性结构线性结构:1、线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系2、线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构,顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的**(元素存储的地址是连续的)**3、链式存储的线性表称为链表,链表中存储的元素不一定是连续的**(元素存储的地址是连续的)**,元素节点中存放数据元素...原创 2020-01-14 11:19:57 · 250 阅读 · 0 评论