- 博客(99)
- 收藏
- 关注
原创 leetcode hot100 最小栈 java
题目描述设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。方法:辅助栈在push的时候,如果辅助栈为空或者元素x小于或等于辅助栈的栈顶元素(peek()),则辅助栈也加进该值。在pop的时候,如果弹出的元素和辅助栈栈顶元素相同(用equals()),则辅助栈也弹出。top: 返回栈顶元素(peek()
2021-03-19 23:46:44 177
原创 leetcode hot100环形链表II java
题目描述给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。说明:不允许修改给定的链表。方法:快慢指针同时从head出发,设快指针走了n圈,因为快指针始终每次都比慢指针多走一步,则相遇时,快指针的路程:a+n(b+c)+b 慢指针的路程:a+ba+n(b+c)+
2021-03-19 17:50:44 183
原创 leetcode hot100环形链表 Java
题目描述给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。方法一:set方法,将访问过的节点都放到set中,如果有重复,则返回true代码/** * De
2021-03-19 14:03:59 172
原创 leetcode hot100二叉树展开为链表 java
题目描述给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。这道题是前序遍历的变形,因此,可以对二叉树进行前序遍历,获得各结点被访问到的顺序,然后每个结点的左子树都为空,右子树的根节点为下一个结点/** * Definition for a binary tree node. * public class TreeN
2021-03-15 15:53:23 142
原创 leetcode hot100 二叉树的层序遍历 java
题目描述给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。方法:广度优先搜索BFS: 遍历使用队列数据结构void bfs(TreeNode root) { Queue<TreeNode> queue = new ArrayDeque<>(); queue.add(root); while (!queue.isEmpty()) { TreeNode node = queue.poll(); /
2021-03-14 22:23:16 125
原创 leetcode hot100不同的二叉搜索树 java
题目描述给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?示例:【注意这道题是求数的数量,并不用把搜索树都列出来,也就是说只需要求出有多少种形状的树】当n=0时,有一棵树当n=1时,有一棵树当n=2时,有两棵树当n=3时,有5棵树【f(0)*f(2) + f(1)f(1) + f(2)*f(0)】所以当n=4时,有 f(0)f(3) + f(1)f(2) + f(2)f(1) + f(3)f(0) = 15 + 12 21 + 51 = 14res[n] = res[
2021-03-12 20:52:54 140
原创 leetcode hot100二叉树的遍历 java
二叉树的前序遍历 中序遍历 后序遍历递归法:前序遍历/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNo
2021-03-11 23:16:25 92
原创 leetcode hot100单词搜索 java
题目描述给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。board =[ [‘A’,‘B’,‘C’,‘E’],[‘S’,‘F’,‘C’,‘S’],[‘A’,‘D’,‘E’,‘E’]]给定 word = “ABCCED”, 返回 true给定 word = “SEE”, 返回 true给定 word = “ABCB”, 返回 false方法:
2021-03-10 22:03:01 647
原创 leetcode hot100子集 java
题目描述给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。方法:回溯新建一个res队列,作为结果返回新建一个in队列,用来存储符合条件的子集每次到一个层,都可以选择是否将该层的数加入队列in当前层 = 数组的长度时,将in队列加入到res中代码:class Solution { public List<List<Integer>> subsets(int[] nums) { List<List&l
2021-03-08 10:23:15 110
原创 leetcode hot100颜色分类 java
题目描述给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。输入:nums = [2,0,2,1,1,0]输出:[0,0,1,1,2,2]方法:双指针:指针left指向数组第一个数,right指向数组最后一个数遍历数组,将值为2的元素放到最后,如果当前元素值为0,则置于前面class Solution { public void sortC
2021-03-07 22:22:53 123
原创 leetcode hot100爬楼梯 java
题目描述假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。思路:用f(x)表示爬到第x阶的方案数f(1) = 1f(2) = 2f(3) = 3f(4) = 5f(5) = 8…f(n) = f(n-1)+f(n-2)初始化f(0) = 1 f(1) = 1代码:class Solution { public int climbStairs(int n) {
2021-03-06 14:16:50 149
原创 leetcode hot100最小路径和 java
题目描述给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。输入:grid = [[1,3,1],[1,5,1],[4,2,1]]输出:7解释:因为路径 1→3→1→1→1 的总和最小。思路:创建二维数组arr, 与原始网格大小相同,arr[i][j]表示从左上角到(i,j)的最小路径和。arr[0][0] = grid[0][0]其余位置:第一行:arr[0][j] = arr[0]
2021-03-06 13:36:34 123
原创 leetcode hot100不同路径 java
题目描述一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?思路:由于每次只能向下或者向右移动一步,所以要想走到(i,j),如果是向下走一步,则会从(i-1,j)走来,如果是向右走一步,则会从(i,j-1)走来设f(i,j)表示从左上角走到(i,j)的路径数量则f(i,j) = f(i-1,j)+f(i,j+1)特别地,第一行
2021-03-06 12:32:55 110
原创 leetcode hot100合并区间 Java
题目描述以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。思路:如果数组的长度为0或者1,则直接返回该数组初始化count用于计数合并了多少次遍历数组,相邻两个元素intervals[i]和intervals[j],如果 intervals[i][1] >= intervals[j][0] && interval
2021-03-05 22:22:59 196
原创 设计模式——状态模式(java)
情景:互联网公司加班,程序根据不同的时间判断程序员不同的状态。面向过程的代码:package state;public class state { static int hour = 0; static boolean workfinished = false; public static void writeprogram(){ if(hour <12){ System.out.println("当前时间:"+hour+"上午工
2021-02-28 12:21:19 226 2
原创 设计模式——抽象工厂模式(java实现)
情景:项目原先是基于sql server数据库,后来要改为access数据库,需要的改动很多。最基本的数据访问程序,实现新增用户和得到用户用户类:package abstractfactory;public class User { private int id; private String name; public int getId() { return id; } public void setId(int id) {
2021-02-28 10:51:08 301
原创 leetcode hot100 字母异位词分组 java
题目描述字母异位词分组给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例:输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]输出:[[“ate”,“eat”,“tea”],[“nat”,“tan”],[“bat”]]方法:新建一个哈希表map,哈希表的键为一组字母异位词的标志,哈希表的值为一组字母异位词列表。由于互为字母异位词的两个字符串包含的字母是相同的,因此对两个字符串分别排序后得到的字符串是相同
2021-02-26 12:21:49 113
原创 leetcode hot100旋转图像 Java
题目描述给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。方法一【使用另外一个矩阵】观察可知,第一行第x个 旋转到 倒数第一列第x个,第二行第x个 旋转到 倒数第二列第x个,第三行第x个旋转到倒数第三列第x个【由于第一行和最后一列有重合的地方,如果原地旋转,会覆盖,所以需要使用另外一个矩阵】代码:class Solution { public
2021-02-20 23:05:01 98
原创 leetcode hot100 全排列 java
题目描述给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]方法:回溯:回溯的本质是穷举,穷举整棵决策树是不可避免的,所以缺点是复杂度很高。比如【1,2,3】先固定1,再固定2,此时第三位是3然后第一位仍固定1,再固定3,此时第三位是2然后再改变第一位,依次执行。class Solution { public List<
2021-02-14 18:01:03 155
原创 leetcode hot100 组合总和 java
题目描述给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。方法:递归:终止条件:candidates数组被全部用完 或者 target <= 0每次可以选择跳过当前的数,即dfs(i+1),也可以选择使用当前的数,即dfs(i)因为每个数字都可以被无限制地重复使用,所以搜索的下标仍为i代码:class Solution {
2021-02-12 16:43:03 209 1
原创 leetcode hot100 在排序数组中查找元素的第一个和最后一个位置 java
题目描述给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。示例 :输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]方法:二分法搜索target的位置mid,由于数组是升序排列,所以可以在mid的前后继续找定义布尔型变量flag,如果数组中找到target,则为true,否则即为false初始化一个长度为2的数组,分别放targ
2021-02-09 12:56:14 207
原创 leetcode hot100 搜索旋转排序数组 Java
题目描述升序排列的整数数组 nums 在预先未知的某个点上进行了旋转(例如, [0,1,2,4,5,6,7] 经旋转后可能变为 [4,5,6,7,0,1,2] )。请你在数组中搜索 target ,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。示例:输入:nums = [4,5,6,7,0,1,2], target = 0输出:4方法:二分法:mid = left +(right-left)/2mid将序列分割成两部分:如果[left,mid-1]是有序数组,并且targ
2021-02-08 21:41:41 75
原创 leetcode hot100 下一个排列 java
题目描述实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须 原地 修改,只允许使用额外常数空间。示例 :输入:nums = [1,2,3]输出:[1,3,2]方法:比如 123123 132 213 231 312 321可以看出下一个数比当前的数大,需要将后面的”大数“与前面的”小数“交换下一个数增加的幅度尽可能小所以将尽可能小的”大数“与前面的”小数“交换比如
2021-02-07 13:08:25 94
原创 leetcode hot100 括号生成 java
题目描述数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例 :输入:n = 3输出:["((()))","(()())","(())()","()(())","()()()"]方法:当左右括号有大于0个可以使用的时候,才可以分支;产生左分支时,只看当前是否有左括号可以使用产生右分支时,如果右括号的剩余数大于左括号,才可以分支当左右括号都为0时,结算代码:class Solution { public List<String
2021-02-06 11:56:44 99
原创 leetcode hot100有效的括号 java
题目描述给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。辅助栈法:如果字符串的长度是奇数,则直接返回false否则:新建一个map,key为右括号,value为左括号循环遍历字符串,一次取出字符(char c = s.charAt(i))如果遇到左括号,则入栈(stack.push©)如果遇到右括号:如果栈为空,则说明没有对应的左括号,返回false
2021-02-04 12:25:55 98
原创 leetcode hot100 最长回文子串 Java
题目描述给你一个字符串 s,找到 s 中最长的回文子串。示例 1:输入:s = “babad”输出:“bab”解释:“aba” 同样是符合题意的答案。示例 2:输入:s = “cbbd”输出:“bb”方法一:暴力解法:【但是会超时】写一个判断是否为”回文串“的方法:如果字符串起始位置和终止位置的字符相同,再缩小范围判断,一旦不同,就返回falsepublic boolean isHuiWen(String s){int len = s.length();for(int i =
2021-01-28 22:43:43 188
原创 leetcode hot100 两数相加 java
题目描述给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807思路:遍历两个链表,逐位计算它们的和,并与当前位置的进位值相加(有进位则为1,无进位则为0)【循环条件为 l1 不为空 或者 l2 不为空 或者
2021-01-26 20:30:20 149
原创 leetcode 字符串 单词拆分 java
题目描述给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例 :输入: s = “leetcode”, wordDict = [“leet”, “code”]输出: true解释: 返回 true 因为 “leetcode” 可以被拆分成 “leet code”。方法:初始化一个布尔型的数组dp,初始值为false,长度为n+1,n为字符串长
2021-01-24 12:31:23 283
原创 leetcode 字符串 验证回文串 java
题目描述给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。示例 1:输入: “A man, a plan, a canal: Panama”输出: true这道题思路很简单,首先需要将字符串中的非字母和非数字的字符去掉,只保留字母和数字字符,然后将所有字符转化为小写,然后左指针指向的数字和右指针指向的数字比较,如果不相同, 就返回false,直到左右指针相遇。判断指定字符是否是字母或数字:isLetterOrDigi
2021-01-23 22:02:04 193
原创 leetcode 合并两个有序数组 java
题目描述给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。示例 1:输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3输出:[1,2,2,3,5,6]这个题的思路很简单,设置两个指针,一个指向
2021-01-23 21:49:16 169
原创 leetcode 多数元素 java
题目描述给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 :输入:[3,2,3]输出:3方法一:初始化返回的元素res为数组的第一个数 nums[0]遍历数组,如果当前遍历的元素和res相同,则count++,否则count-- ,若count = 0,则将下一个元素的值赋给res举例说明:假设数组为:1 2 1 3 1 2 2则res初始为1nums[0] =
2021-01-23 21:13:25 121
原创 leetcode 位运算 只出现一次的数字 Java
题目描述给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]输出: 1位运算:不使用额外空间,考虑位运算异或运算:交换律:a ^ b ^ c = a ^ c ^ b任何数与0 异或 为任何数 n ^ 0 = n相同的数异或为0 n ^ n = 0假设输入序列为 2 2 1 1 4 3 4则2 ^ 2 ^ 1 ^ 1 ^ 4
2021-01-17 17:11:53 98
原创 leetcode动态规划 最大子序和 Java
题目描述给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。输入: [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。思路一:对数组进行遍历,当前最大连续子序列和为temp,结果为maxsumtemp 每次取 nums[i] 和 temp+nums[i] 的较大值每次比较temp和maxsum,将最大值置为maxsumclass Solution { public i
2021-01-17 16:21:40 66
原创 vue 动态粒子背景插件
动态粒子背景效果如下:vue-particles 是粒子背景插件如何使用?安装插件npm install vue-particles --save-dev在main.js文件中全局引入:import VueParticles from 'vue-particles' Vue.use(VueParticles)然后在vue文件中使用: <vue-particles color="#409EFF" :particleOpacity=
2021-01-17 11:30:50 668
原创 element-ui layout布局
今天在新建的vue中需要用到el组件的布局,但是侧边栏总会占一行,需要展示的页面会在侧边栏的下边,如下图:而且,侧边栏菜单的样式也没有。li标签还有原始的小点,如下:(其实在这里就该意识到是css的问题)然后我新建的一个空项目,复制element官网上的例子,安装element-ui依赖:npm install --save element-ui 在main.js中:import Element from 'element-ui'Vue.use(Element)但是还是出现下面的奇怪
2021-01-16 22:24:23 3093
原创 前端展示知识图谱 html转vue
在vue中如果需要引入外部js,用下面的语句: <script src="../../../dist/static/js/materialize.min.js"></script>原文件中,单独的kg.js文件中有下面这样的方法:我将其直接写到vue文件的js部分:红框是注意更改的地方。原html中,引入外部的d3.js文件: <script src="js/d3.v3.min.js"></script>我在vue中npm inst
2021-01-16 15:52:59 2036
原创 leetcode 贪心算法 跳跃游戏(I II) Java
跳跃游戏一:题目描述给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例 1:输入: [2,3,1,1,4]输出: true解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。思路:贪心法:依次遍历数组中的每一个位置,并实时维护最远可以到达的位置,如果最远可以到达的位置大于或等于数组中的最后一个位置,那则说明最后一个位置可以到达,就直接返回true,如
2021-01-14 11:18:23 174
原创 设计模式——观察者模式
场景一:老板出门回来的时候,前台秘书给大家打电话,大家马上各就各位,这样就不会被老板发现问题。第一版代码(双向耦合)前台秘书类:package observer1;import java.util.*;public class secretary { private List<observer> observers = new ArrayList<>(); private String action; public void attach(obse
2021-01-06 12:00:37 156
原创 leetcode双指针 实现strStr() java
题目描述实现 strStr() 函数。给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1示例 1:输入: haystack = “hello”, needle = “ll”输出: 2思路:只有子串的第一个字符跟 needle 字符串第一个字符相同的时候才需要比较。然后一个字符一个字符比较,一旦不匹配了就立刻终止。发现不匹配时,开始回溯。需要注意的是,pn 指针是移动到
2021-01-03 17:19:11 138
原创 leetcode 双指针 移除元素 java
题目描述给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 1:给定 nums = [3,2,2,3], val = 3,函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。思路:双指针:i是慢指针,j是快指针,当nums[j]
2021-01-03 17:13:54 86
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人