算法题
算法
沐三i
这个作者很懒,什么都没留下…
展开
-
java-去除重复字母(leetcode316)
给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。示例1:输入:s = “bcabc”输出:“abc”示例2:输入:s = “cbacdcbc”输出:“acdb”使用LinkedList模拟一个栈,使用一个count数组来记录字符串中每个字符出现的次数。然后对字符串开始遍历,如果该字符不在栈中,那么便把他与栈顶字符进行比较,如果他的字典序比栈顶字符小,并且栈顶字符后面还出现过,那么就弹出栈顶元素,循环判断。.原创 2022-06-29 09:47:22 · 531 阅读 · 0 评论 -
java-字符串解码(leetcode394)
给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。示例1:输入:s = “3[a]2[bc]”输出:“aaabcbc”示例2:输入:s = “3[a2[c原创 2022-06-27 17:13:05 · 650 阅读 · 0 评论 -
java的快速排序
简介快速排序是一种既不浪费空间又可以快一点的排序算法。快速排序只用了本身一个数组,没有使用额外的数组空间。实现逻辑先从数组中取一个数作为基准数(通常取第一个数)分区,将比这个数大的数全放到它的右边,小的数全放到它的左边再对它的左边和右边继续分区,直到各区间只有一个数代码(java) // l:数组的开始下标 r:数组的结束下标 public void QuickSort(int[] nums,int l,int r){ if (l>r){原创 2021-12-16 09:30:15 · 1041 阅读 · 0 评论 -
java的KMP算法
KMP算法是由三个人共同提出,并以他们名字的首字母命名的,故叫做KMP算法。该算法相对于 Brute-Force(暴力)算法有比较大的改进,主要是消除了主串指针的回溯,从而使算法效率有了某种程度的提高。KMP算法要利用一个next数组:next[i]:从下标为0到i的子串的前缀和后缀相等的最大长度。同时也就表示要回退的位置(不是对称,是从左往右相等)next求法前缀:不包含最后一个字符的子串。比如aab的前缀是a或者aa后缀:不包含第一个字符的子串。比如aab的后缀是b或者ab求出next数组后,原创 2021-12-14 09:53:31 · 493 阅读 · 0 评论 -
java动态规划-乘积最大子数组
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。输入: [2,3,-2,4]输出: 6输入: [-2,0,-1]输出: 0思路:因为是乘积,有可能出现负负得正的情况,所以不仅要记录最大值还要记录最小值代码: //因为存在负负得正的关系,所以定义了min public int maxProduct(int[] nums) { //re为结果 int re=nums[0];原创 2021-11-29 10:36:14 · 331 阅读 · 0 评论 -
java动态规划-单词拆分
给你一个字符串 s 和一个字符串列表 wordDict 作为字典,判定 s 是否可以由空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。输入: s = “leetcode”, wordDict = [“leet”, “code”]输出: true输入: s = “applepenapple”, wordDict = [“apple”, “pen”]输出: true思路:采用动态规划的思路,dp[i]表示字符串的前i个字符能否被字典的单词拆分,递推公式:dp[i]=原创 2021-11-26 10:47:59 · 564 阅读 · 0 评论 -
java动态规划-买卖股票
给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例1:输入: prices = [7,1,5,3,6,4]输出: 7示例2:输入: prices = [1,2,3,4,5]输出: 4思路:采用动态规划的思路,每天只有持股或者未持股两种状态,因此可以new一个dp数组。dp[i][0]:表示原创 2021-11-20 08:47:33 · 826 阅读 · 0 评论 -
java动态规划-交错字符串
给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:输入:s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbcbcac”输出:true输入:s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbbaccc”输出:false思路:定义一个二维boolean类型的dp数组dp[n][m],n表示s1的字符下标,原创 2021-11-15 15:13:48 · 351 阅读 · 0 评论 -
java动态规划
什么是动态规划?动态规划是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。也就是把一个复杂的问题拆分成几个小问题,再把小问题继续拆分,然后先从小问题开始解决,层层向上,最终得到复杂问题的答案。三大性质最优子结构性质:如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。子问题重叠性质:子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不原创 2021-11-15 13:48:08 · 1145 阅读 · 0 评论 -
java单词搜索
给定一个 char类型的二维数组网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。例如:思路:以二维数组的每个字符为首来进行判断,如果首字符匹配,则先修改使用过的值,再向字符四周进行扩散,如果找到则返回true。使用了递归的思想。代码: public boolean exis原创 2021-11-11 10:09:27 · 624 阅读 · 0 评论 -
java全排列
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]思路:采取递归的方法来对每个数据进行遍历,并使用一个数组来标记该数据是否被访问过 public List<List<Integer>> permute(int[] nums) { List<List<Intege原创 2021-11-04 15:33:49 · 200 阅读 · 0 评论 -
java字符串相乘
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。输入: num1 = “2”, num2 = “3”输出: “6”输入: num1 = “123”, num2 = “456”输出: “56088”思路:其实就是手写乘法的过程,首先我们要知道一个数学定理:两个长度分别为n和m的数相乘,长度不会超过n+m,所以我们可以创建一个长度为n+m的数组来存储结果。使用两个for循环从字符串的最低位开始计算,一个字符乘以一个字符,原创 2021-11-04 10:34:28 · 3406 阅读 · 0 评论 -
java在排序数组中查找元素的第一个和最后一个位置
给定一个升序排列的整数数组,和一个目标值,找出给定目标值在数组中的开始位置和结束位置,如果数组中不存在目标值,返回[-1,-1]输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]输入:nums = [5,7,7,8,8,10], target = 6输出:[-1,-1]思路:通过二分法来找出目标值的左边界和右边界 public int[] searchRange(int[] nums, int target) { int[] re =原创 2021-11-03 14:02:56 · 646 阅读 · 0 评论 -
java括号匹配
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。输入:s = “([)]”输出:false输入:s = “{[]}”输出:true思路一:采用栈的方式来判断,当是左括号时,往栈里压入一个右括号;当是右括号时,就把栈里元素弹出来判断 public boolean isValid(String s) { Stack<Character原创 2021-11-02 13:57:54 · 3156 阅读 · 1 评论 -
java最长公共前缀
给定一个字符数组,要求找到其中的最长公共前缀输入:strs = [“flower”,“flow”,“flight”]输出:“fl”思路:先找出数组中的最短的字符串,然后再利用indexOf函数来判断是不是公共前缀,如果不是,则将最短的字符串-1再判断indexOf方法详解:indexOf(int ch)返回指定字符在此字符串中第一次出现处的索引indexOf(String str) 返回指定子字符串在此字符串中第一次出现处的索引indexOf(int ch, int fromIndex)原创 2021-11-02 10:14:42 · 185 阅读 · 0 评论 -
java最长回文子串
给定一个字符串,求最长的回文子串例1:输入:s = “babad”输出:“bab”例2:输入:s = “cbbd”输出:“bb”思路:因为是回文子串,所以会以一个中心两边对称,因此采用中心扩散法,选定一个中心,向两边扩散,但会存在中心是一个字符或者是两个字符的情况。当中心是一个字符时,长度为奇数,当中心是两个字符时,长度为偶数 public String longestPalindrome(String s) { if (s.length()<1){//防原创 2021-11-01 10:33:31 · 1161 阅读 · 2 评论 -
java求不重复最长子串及其长度
本题要求传入一个字符串,求出不重复最长子串的长度,但我在求最大长度的基础上,增加了输出最长子串(存在bug)思路:通过hashmap的key值唯一来判断是否出现重复字符,当出现重复字符,再判断是否为最大长度,如果是则通过另一个hashmap来保存,并且使用回溯来返回第一个重复字符的下一个字符,并且清空记录字符串的hashmap。因为hashmap无序唯一的特点,所以采取key记录字符,value记录下标,这样最后通过下标来调整字符串的顺序。 public static int lengthOf原创 2021-10-29 09:59:51 · 1040 阅读 · 0 评论