
算法与数据结构
qq_43641886
这个作者很懒,什么都没留下…
展开
-
我的一百道题--vol.1三数之和
首先对数组进行排序,取出第一个数作为结点,然后使用双指针 left 和right 进行遍历,如果存在三数之和等于零,则对left 和right进行查重,遍历完后,对a进行查重时间复杂度为O(n^2)空间复杂度O(n)arrays.sort排序class Solution { public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> list=ne原创 2020-06-18 17:43:51 · 175 阅读 · 0 评论 -
HashSet原理
hashset继承里abstractset类,实现了cloneable,serializable,set接口内部是通过hashmap实现的内部只有两个成员变量 private transient HashMap<E,Object> map; // Dummy value to associate with an Object in the backing Map //是所有写入 map 的 value 值。 private static final Obj原创 2020-05-31 10:46:18 · 150 阅读 · 0 评论 -
堆排序原理
堆是一个完全二叉树;堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。通过数组实现一个堆往堆中插入一个元素public class Heap { private int[] a; // 数组,从下标1开始存储数据 private int n; // 堆可以存储的最大数据个数 private int count; // 堆中已经存储的数据个数 public Heap(int capacity) { a = new int[capacity + 1];原创 2020-05-27 17:17:06 · 144 阅读 · 0 评论 -
LFU 算法实现 优先队列+hashmap
首先创建一个内部结点包含四个参数 频率 索引 键 值这个内部结点node实现了comparable类里面的compareto 方法,当 他们出现的频率相同的时候,比较他们的索引大小get方法通过hashmap获得node,如果node==null,返回-1否则就更新node的频率和索引通过queue.remove queue.offer操作进行排序put方法通过hashmap获得node,如果node!=null,更新node的频率和索引,和get方法类似,并且从map中移除键值原创 2020-05-26 20:39:53 · 430 阅读 · 0 评论 -
LRU算法实现 双向链表+哈希表
创建一个双向链表,有key ,value, 前驱节点 和后继节点class Node{ int key; int value; Node next; Node pre; Node(int key,int value){ this.key=key; this.value=value; } }在主类里面创建四个实例字段 private in.原创 2020-05-25 10:21:36 · 682 阅读 · 0 评论 -
每日一题--x的平方根 5.9
采用二分法进行判断,需要对零进行排除,因为为了防止溢出,我采取的是compare(x/a,a)的方式,如果a==0,那么比较将无意义,时间复杂度为O(logn)空间复杂度为O(1) public int mySqrt(int x) { if(x==0)return 0; //采用二分法,左节点和右节点 int left=1; int right=x; while(left<right){ /.原创 2020-05-09 09:37:53 · 149 阅读 · 0 评论 -
腐烂的橘子
使用广度遍历实现该算法,时间复杂度为O(row*col),空间复杂度为O(row*col),class Solution { public int orangesRotting(int[][] grid) { //记录橘子的位置 Deque<Integer> rq=new LinkedList<>(); Deque<I...原创 2020-03-04 10:28:56 · 145 阅读 · 0 评论 -
验证二叉树搜索
看到这道题就要马上想到二叉搜索树的性质,中序遍历以后从小到大排列,且没有相等的值,以下三种解法,是逐步优化的过程,时间复杂度都为O(N),空间复杂度前两个为O(N),后一个为O(1)(重点是double stamp=-Double.MAX_VALUE)但是Double.MIN_VALUE却是一个正数:class Solution { boolean judge=true; ...原创 2020-03-02 11:15:27 · 154 阅读 · 0 评论 -
翻转二叉树
public TreeNode invertTree(TreeNode root) { helper(root); return root; } public void helper(TreeNode root){ if(root==null){ return; } //这和两个...原创 2020-02-27 17:39:03 · 149 阅读 · 0 评论 -
存在重复元素II
刚开始没有理解题意,以为存在间距为k的两个数相等才能返回后来又认为 没有超过间距为k 的两个数才能返回其实是只要存在两个相等数,它们俩之间的间距小于等于k就可以返回true初始代码 public boolean containsNearbyDuplicate(int[] nums, int k) { Map<Integer,Integer> map=n...原创 2020-02-27 17:28:17 · 107 阅读 · 0 评论 -
零钱兑换
使用动态规划 时间复杂度为O(amount*n) 空间复杂度为O(amount)public int coinChange(int[] coins, int amount) { if(amount==0){ return 0; } int[] ans=new int[amount+1]; ans[0]=...原创 2020-02-26 09:53:10 · 103 阅读 · 0 评论 -
数组中相同的数
给定一个升序数组1,元素有重复,对每个元素算一下平方后得到新的数组2,问数组2中不相同的元素共有多少个?给出算法和空间复杂度,要求尽量优化时间复杂度为O(n)空间复杂度为O(1)public int repeat(int[] num) { int left=0; int right=num.length-1; int count=0; //先判断本身的重复项,然后再判断对称重...原创 2020-02-25 17:07:58 · 725 阅读 · 3 评论 -
二叉树的序列化
差不多搞了两个半小时,终于出来了,目前最大的问题是 在LeetCode上不停的调试和试错,才能得出最终答案,在敲代码的过程中会犯各种各样的毛病,而且对二叉树的序列化不是很清楚,判别条件上也总是出错,总之就是很菜使用的是层序遍历,也就是BFS/** * Definition for a binary tree node. * public class TreeNode { * in...原创 2020-02-19 18:06:11 · 120 阅读 · 0 评论 -
二叉搜索树的双向链表
条件:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。根据二叉搜索树的性质,我们要采取中序遍历的方法,这与链表中翻转链表相似,都是利用指针的性质进行的采用了分治算法时间复杂度nlognclass Solution {//创建头指针,前一个指针,尾指针 Node head=null,pre=null,tail=n...原创 2020-02-18 17:29:15 · 114 阅读 · 0 评论 -
单词搜索
这道题主要使用了回溯的方法,遍历了整个数组,class Solution { char[][] board; String word; int xlen; int ylen; public boolean exist(char[][] board, String word) { //进行初始条件判断 if(word==null|...原创 2020-02-16 18:06:13 · 117 阅读 · 0 评论 -
把数组排成最小数
该题的关键就是将数字转换为字符串,并且使用lamda表达式进行比较,import java.util.ArrayList;import java.util.Arrays;public class Solution { public String PrintMinNumber(int [] numbers) { String[] str=new String[num...原创 2020-02-15 18:10:52 · 93 阅读 · 0 评论 -
正则表达式匹配
LeetCode上的测试用例并没有"**",首先我们要分为三种情况s.charAt(i)==p.charAt(j) ||p.charAt(j) =='.'则进行下一个字符的判断p.charAt(j)=='*',则需要对前面的值进行判断 1. 如果j为起点,则i,j+1 2. s.charAt(i)==p.charAt(j-1) ||p.charAt(j-1) =='.' 1. 分三...原创 2020-02-15 16:50:27 · 175 阅读 · 0 评论 -
正则表达式入门
实践出真知^[-+]?\\d*(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?$^ The beginning of a line $ The end of a line ^ 和 美元符号框定正则表达式,它指引这个正则表达式对文本中的所有字符都进行匹配。如果省略这些标识,那么只要一个字符串中包含一个数字这个正则表达式就会进行匹配[-+]? one or more ...原创 2020-02-12 11:34:03 · 264 阅读 · 0 评论 -
剪绳子
有一种害怕是你自己看着害怕,这道题看着很复杂,但是用动态规划的思想是很容易解答出来的//创建全局变量,剪枝 int[] ref; public int cutRope(int target) { this.ref=new int[target+1]; //创建辅助函数 return helper(target); ...原创 2020-02-08 16:52:03 · 83 阅读 · 0 评论 -
字符串排列
import java.util.ArrayList;import java.util.Arrays;public class Solution { public ArrayList<String> Permutation(String str) { int len=str.length(); ArrayList<String> ...原创 2020-02-06 17:36:53 · 115 阅读 · 0 评论 -
孩子们的游戏
这道题很简单,使用bo标志位和list数组进行双指针计算,import java.util.List;import java.util.ArrayList;public class Solution { public int LastRemaining_Solution(int n, int m) { //当孩子为0时,返回-1 if(n==0)retur...原创 2020-02-06 17:35:10 · 187 阅读 · 0 评论 -
矩阵覆盖
这与跳台阶问题是一个套路,一次选择跳一个还是跳两个,这个矩阵覆盖也只有两种选择,一是横着放一次占用两格,二是竖着放但是一次占用四格public int RectCover(int target) { if(target==0){ return 0; } if(target==1){ return 1;...原创 2020-02-06 15:41:10 · 130 阅读 · 0 评论 -
滑动窗口的最大值
该题考察滑动一数组框时,最大值的变化,我们可以使用双指针来进行滑动灵感来自于LeetCode长度最小的子数组中的利用双指针将时间复杂度降为O(n),详情看代码import java.util.ArrayList;public class Solution { public ArrayList<Integer> maxInWindows(int [] num, int si...原创 2020-02-05 17:56:18 · 119 阅读 · 0 评论 -
二叉搜索树的第K个结点
我是使用了中序遍历的方法,如果想要更快,可以让List直接与k进行判断,满足则跳出递归(在LeetCode上可以使用该法)public class Solution { TreeNode KthNode(TreeNode pRoot, int k) { List<TreeNode> ln=new ArrayList<...原创 2020-02-04 17:38:45 · 113 阅读 · 0 评论 -
链表中环的入口结点
我使用的利用哈希表来判断入口结点没有达到LeetCode上进阶的要求,public ListNode detectCycle(ListNode head) { if(head==null){ return null; } if(head.next==null){ return null; ...原创 2020-02-04 16:54:27 · 131 阅读 · 0 评论 -
数组中重复的数字
这是令人费解的一道题条件所有数都必须在0~n-1之间numbers!=null ???取第一个重复的数做法使用哈希表 public boolean duplicate(int numbers[],int length,int [] duplication) { if(numbers==null){ return false; ...原创 2020-02-04 16:53:15 · 144 阅读 · 0 评论 -
两个链表的第一个公共结点
这一题从LeetCode上的删除链表的倒数第n结点获得解题方法,利用两个链表前后遍历,中间间隔n个结点找出要删除的结点设定一个哑点,避免删除第一个结点时的尴尬,时间复杂度为O(max(p1.length,p2.length))public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { List...原创 2020-02-03 15:47:43 · 96 阅读 · 0 评论 -
数字1的个数
搞了一个小时多终于搞出来了判断每一位出现1的概率特殊情况 1 0通过找规律得到答案如果为零count+=n*cs;如果为1count+=cur%cs+pre/10*cs+1;其他数count+=(n+1)*cs; public int countDigitOne(int n) { if(n<1) return 0; ...原创 2020-02-02 18:01:11 · 302 阅读 · 0 评论 -
构建乘积数组
第一种方法是使用两层循环 当i!=j时B[i]*=B[i]*A[j],时间复杂度为O(n^2) public int[] multiply(int[] A) { int[] B=new int[A.length]; for(int i=0;i<A.length;i++){ B[i]=1; ...原创 2020-02-02 16:21:07 · 101 阅读 · 0 评论 -
不同的二叉搜索树II
使用了分治算法,以及二叉搜索树的基本性质左子树<根节点<右子树class Solution { public List<TreeNode> generateTrees(int n) { //创建链表,n为零时,返回空链表 List<TreeNode> list=new ArrayList<>(); ...原创 2020-01-31 17:51:55 · 87 阅读 · 0 评论 -
从中序遍历和后序遍历构造二叉树
前序遍历顺序 根节点 左子树 右子树 中序遍历 左子树 根节点 右子树 后序遍历 左子树右子树 根节点这道题和从前序与中序遍历序列构造二叉树,只是 root.right=helper(mid+1,right);root.left=helper(left,mid);顺序发生改变 仍然是使用全局变量post_index,从后往前 创...原创 2020-01-31 16:28:39 · 209 阅读 · 0 评论 -
最大子序和
这道题使用暴力解法很容易得出结果 可是时间复杂度为O(n^ 2)所以我们采取动态规划的方法,我还是不太明白,可能是数学没学好吧 if(nums.length==0){ return -1; } int sum=0; int ans=Integer.MIN_VALUE; //遍历数组 时间复杂度为O(n...原创 2020-01-30 15:40:12 · 107 阅读 · 0 评论 -
剑指offer--二维数组中的查找
第一种方法:使用二分法进行查照/*这是最原始的二分法查找没有进行剪枝*/public class Solution { public boolean Find(int target, int [][] array) { if(array.length==0){ return false; } int len=a...原创 2020-01-11 10:22:52 · 124 阅读 · 0 评论 -
整数替换_算法
原创 2019-11-28 14:53:35 · 236 阅读 · 0 评论 -
11.14小记
java中this语句的用法Java中this关键字详解Java中this关键字的详解将字符串转换为一个新的字符数组map遍历方法一:在for循环中遍历key或者values,一般适用于只需要map中的key或者value时使用,在性能上比使用entrySet较好; for(String key : map.keySet()){ System...原创 2019-11-25 21:32:26 · 122 阅读 · 0 评论 -
11.3小记
MySql中 delimiter 详解执行终止符delimiter ;; 设定在遇到两个分号时才执行程序默认是; 读取完毕后执行程序位运算太难了原创 2019-11-13 21:56:57 · 170 阅读 · 1 评论 -
11.10小记
jar包关于jar包的一切——java笔记287寻找重复数原创 2019-11-10 21:56:46 · 100 阅读 · 0 评论 -
11.8小记
什么是native方法简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数。“A native method is a Ja...原创 2019-11-08 23:27:03 · 110 阅读 · 0 评论 -
关于121.买卖股票
A more clear explanation on why sum of subarray works.:Suppose we have original array:[a0, a1, a2, a3, a4, a5, a6]what we are given here(or we calculate ourselves) is:[b0, b1, b2, b3, b4, b5, b6]...原创 2019-11-05 21:56:47 · 152 阅读 · 0 评论 -
10月26号小记
10月26号小记redisredis安装和启动redis源码动态扩容copy-on-write 针对哈希表详情可见 数据结构与算法之美19|散列表(中):如何打造一个工业级水平的散列表?mysqlmysql在cmd窗口出现 ‘mysql’ 不是内部或外部命令,也不是可运行的程序或批处理文件。 可能的原因配置环境变量,其优先级要高一点,不然可能识别不了要配置my...原创 2019-11-03 15:58:16 · 116 阅读 · 0 评论