leetcode刷题
weixin_43207987
这个作者很懒,什么都没留下…
展开
-
至少有k个重复的最长字符串-leetcode_395
找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k 。输出 T 的长度。s = “aaabb”, k = 3输出:3最长子串为 “aaa” ,其中 ‘a’ 重复了 3 次。解:这道题的主要思路是通过使用分而治之;算是一道字符串的经典操作题了,class Soultion{ public int longestSubstring(String s,int k){ int len=s.length(); if(len==0||len<原创 2020-07-29 09:59:56 · 241 阅读 · 0 评论 -
力扣33.搜索旋转排序数组
假设升序排序的数组在某个节点上进行了旋转,比如说[1,2,3,4,5,6]旋转之后变成了[4,5,6,1,2,3]搜索一个给定的目标值,如果数组中存在这个目标值,则返回该值的下标,否则的话返回-1;思路:题目要求使用O(logn)的时间复杂度,因此主要考虑二分法二分法的主要模板如下所示:int left=0,right=nums.length-1;while(left<=right){ int mid=(left+right)/2; //如果满足某个条件的话 就返回 if()原创 2020-07-18 21:37:48 · 118 阅读 · 0 评论 -
力扣 208实现前缀树
所谓的前缀树:是一种树形结构,利用字符串的公共前缀来减少查询时间;最大限度地减少无所谓字符串的比较;它有3个性质:根节点不包括字符;除根节点外每一个节点都只包含一个字符,从根节点到某一个节点,路径上经过的字符连接起来为该节点对应的字符串,每个节点的所有子节点包含的字符都不相同;//实现一个前缀树,包含insert,search,startwith三个函数分析:主要考察堆前缀树的理解;例: Trie trie=new Trie();trie.insert(“apple”);trie.search(原创 2020-07-09 16:02:39 · 709 阅读 · 1 评论 -
剑指offer 49 丑数
我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。解:对于这道题的理解;这里的质因子指的是一个数的约数,并且是质数;把一个合数写成几个质因数的乘积的形式,即求质因数的过程叫做分解质因数;任何一个丑数都是由小于它的某一个丑数2,3,5,得到的,如何得到所有的丑数?现在假设由三个数组:分别是:A:{12,22,32,42,52,62…};B:{13,23,33,43,53,63…};C:{15,25,35,43,53,6*3…};所有丑原创 2020-07-09 10:19:29 · 60 阅读 · 0 评论 -
剑指offer 46:把数字翻译成字符串
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”,请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法;首先这道题的主要思路是动态规划的思路;设这个数字为x1,x2,x3,…xi-2,xi-1;根据这个顺序,当(i-2,i)这两位数所表示的数在[10,25]的时候,则当前的可翻译的数字种类数可以表示为dp[i-1]+dp[i-2];否则的话其翻译种类数就是dp[i-1];public int tran原创 2020-07-06 11:00:23 · 72 阅读 · 0 评论 -
剑指offer36 二叉搜索树与双向链表的转换
这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针;对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。head指向当前节点的最小值;//因为这个是一个二叉搜索树,所以采用类似于中序遍历的方式,先找到其左节点中的最小值,然后再找到根节点,最后再找到其右节点;Node pre=null,head=null;public Node treeToDoublyList(Node root){ if(root==null) return null;原创 2020-07-03 16:12:15 · 56 阅读 · 0 评论 -
leetcode 38字符串的排列
输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。//本质还是回溯的思想;这里设置了一个flag数组,用来标识字符是否被访问过;//有一点就是 将 set或者是List转化为数组,这里使用了 res.toArray(new String[0]); 这里就是使用了一个toArray()函数,其参数使用了 new String[0];表示要将其转化为string数组;Set<String> res=new HashSet<&g原创 2020-07-03 10:33:21 · 110 阅读 · 0 评论 -
leetcode35 复杂链表的复制
输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]//这道题的思路:1.首先在每一个结点之后复制一个相同值的新节点2.然后复制每一个结点的随机指针;3.最后将两个链表一分为二;public Node copyRandomList(Node head){ if(head==null) return null; //1.复制新的结点 Node cur=head; whi原创 2020-07-02 18:07:38 · 57 阅读 · 0 评论 -
leetcode 63 寻找数组中出现一半次数以上的数字
1.第一种思路:通过使用hashmap,存储对应的数字以及它出现的次数,最后遍历hashmap,返回其次数大于数组一半的那个数字2.第二种思路:使用摩尔投票法;选定数组中的第一个数组int num=arr[0];int count=0;for(int i=1;i<arr.length-1;i++){ if(arr[i]!=num)}{ //如果不相等的话就将其count --; count--; if(count<0){ num=arr[i]; count=原创 2020-07-02 09:50:35 · 101 阅读 · 0 评论 -
最长重复子串的长度
最长的重复子串的长度;import java.util.ArrayList;import java.util.Collection;import java.util.Collections;import java.util.Scanner;public class zuichang_chongfuzichuan { private static String result=""; public static void main(String[] args) { S原创 2020-05-19 18:30:30 · 504 阅读 · 0 评论 -
leetcode剑指offer20:表示数值的字符串
该题一开始的思路还是比较复杂的,参考了答案//设置了三个布尔变量,分别表示是否出现过数字,点e或者Epublic static boolean isValid(String s){ //首先考虑边界情况, if(s.length()==0||s==null){ return false;} //对于大部分字符串的操作都是首先将其转化为字符串组,java中有一个可以去除掉首尾字空格符的函数 trim()函数 char[] str=s.trim().toCharArray(); boolean原创 2020-05-15 10:55:20 · 108 阅读 · 0 评论 -
取得第k大元素Leetcode 215
1.最原始得暴力解法,可以使用堆排序的想法,建立一个小根堆或者是大根堆,先对其进行排序,然后取排序后数组中的第k大就是取nums.length-k,比如说所给的数组是[2,3,7,6,1],该数组排序后就是[1,2,3,6,7],如果要得到第二大的元素的话,就是6,其索引下标是3,就是nums.length-k=5-2=3;得到最后的结果;堆排序比较重要的过程就是堆调整的过程,比较父节点与孩子节点之间的大小,其空间复杂度是O(n),时间复杂度是O(nlogn);public class Heapsort原创 2020-05-14 23:23:41 · 99 阅读 · 0 评论 -
Leetcode 148
关于链表排序的思想1。题目要求使用的时间复杂度为O(nlogn)2.要求使用的空间复杂度为O(n);首先根据时间复杂度很容易想到的一个方法就是使用归并排序;归并排序的思想之前在排序算法的总结中有提到:主要思想就是分而治之的思想,将两两排序后的结果进行合并得到的结果,其中使用了递归,因此其空间复杂度为O(logn),但是由于链表的话,可以使用链表的插入删除因此其空间复杂度可以降低。可以从底向上,使用常数级别的空间;在这里插入代码片...原创 2020-05-10 11:16:07 · 89 阅读 · 0 评论 -
Leetcode 两数之和,三数之和,四数之和
两数之和的思想比较简单啦 就是 使用一个map存储其值,然后将其下标返回即可;三数之和 ,四数之和的思想比较类似,就是使用双指针的思想:三数之和的代码如下所示:四数之和的代码如下:有一些优化四数之和是在三数之和的基础上增加了一层循环,class Solution { public List<List<Integer>> fourSum(int[] nu...原创 2020-05-04 22:43:27 · 98 阅读 · 0 评论 -
Leetcode 8 将字符串转化为整数
//这里依然涉及到了字符串的操作;还是不是很熟悉//在这里参考了答案,首先先将字符串转化为字符串数组//1.第一步先删掉前导空格符;相当于从第一个非空格的字符开始//判断这个字符是负号,正号,还是数字,还是其他非法字符,如果是非法字符的话直接返回0;/这里设置了一个判断是负数还是正数的标志;//接下来就判断剩下的字符中是数字的字符在这个过程中有可能会出现溢出的情况,因为题目所给的是in...原创 2020-04-27 17:56:10 · 59 阅读 · 0 评论 -
Leetcode210_课程表II
这道题仍然是利用了拓扑排序的思想,同leetcode207//写代码的过程中发现对队列的操作还不是很熟悉先总结一下队列的操作:add(e);offer(e) //都是向队列中添加元素;所不同的是第一个方法添加失败的时候(队列满的时候)会抛出异常第二个方法添加失败的时候会返回false;remove(),poll() // 都是向队列中删除元素;第二个方法还可以返回返回队首元素;所不...原创 2020-04-27 12:18:45 · 93 阅读 · 0 评论 -
拓扑排序 leetcode207
拓扑排序的思想:1.选择入度为0的顶点,将其输出2.将该顶点所有的边全部删除3.如此重复上述步骤,如果最后输出的顶点的个数等于图中顶点的个数则该图中没有环,否则该图中有环;```javapublic class Solution { public boolean canFinish(int numCourses, int[][] prerequisites)...原创 2020-04-25 11:05:18 · 103 阅读 · 0 评论