数据结构JAVA
哈特谢普苏特
海上生明月
展开
-
Semaphore/CountDownLatch/CyclicBarrier
CountDownLatch --CyclicBarrier ++Semaphore -- 资源不足import java.util.concurrent.Semaphore;import java.util.concurrent.TimeUnit;public class SemaphoneDemo { public static void main(String[...原创 2020-04-18 23:25:50 · 137 阅读 · 0 评论 -
Leetcode88. 合并两个有序数组
使用双指针,从后往前插数据,用使用Index记录当前数组的位置class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { // System.arraycopy(nums2, 0, nums1, m, n); // Arrays.sort(nums1); ...原创 2020-03-24 17:58:33 · 96 阅读 · 0 评论 -
Leetcode8. 字符串转换整数 (atoi)
这种题好无聊,需要考虑很多条条框框。如“-+1”的输出结果是0而不是-1或者1.为实现这个目标,我们需要两个boolean型变量,一个用来判断是否出现了负号(有可能是负数),一个用来判断是否是数字(如-+)的情况就不是数字。如果它出现了负号并且出现了正号,表明这不是一个数字,返回0请你来实现一个atoi函数,使其能将字符串转换成整数。首先,该函数会根据需要丢弃无用的开头空格字符,直到...原创 2020-03-24 17:29:14 · 147 阅读 · 0 评论 -
Leetcode7整数反转
没有考虑到的问题:Integer的最大值(2147483647)问题,以为直接用栈即可。事实上并不是这样,如果一个数本来是int,但是反转后会超出最大值范围class Solution { public int reverse(int x) { String data = x +""; boolean flag = false; Sta...原创 2020-03-24 16:39:37 · 125 阅读 · 0 评论 -
Leetcode86. 分隔链表
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。示例:输入: head = 1->4->3->2->5->2, x = 3输出: 1->2->2->4->3->5对链表的掌握还是太菜,debug了半天,自己的理解是找出比...原创 2020-03-23 21:08:09 · 83 阅读 · 0 评论 -
Leetcode876. 链表的中间结点
给定一个带有头结点head的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例 1:输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。注意,我们返回了一个 ListNode 类型的对象 ans,这样:ans.val = 3, ans...原创 2020-03-23 18:16:41 · 98 阅读 · 0 评论 -
Leetcode945.使数组唯一的最小增量
最先想到Arrays.sort()用法,可以对数组进行排序,这样做测试是正确的,但是超过时间限制class Solution { public int minIncrementForUnique(int[] A) { Arrays.sort(A); int count = 0; for(int i = 1; i < A.length...原创 2020-03-22 19:02:28 · 153 阅读 · 0 评论 -
Leetcode28实现 strStr()
我不太明白,同样的例子'''',在Leetcode中是-1,然鹅在eclipse中是0然后我明白了,是""的原因,如果字串为空,则返回0的位置 实质上上KMP算法实现strStr()函数。给定一个haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。示例...原创 2020-03-22 17:36:53 · 127 阅读 · 0 评论 -
Leetcode4. 寻找两个有序数组的中位数
给定两个大小为 m 和 n 的有序数组nums1 和nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为O(log(m + n))。你可以假设nums1和nums2不会同时为空。示例 1:nums1 = [1, 3]nums2 = [2]则中位数是 2.0示例 2:nums1 = [1, 2]nums2 = [3, 4]则中位数是...原创 2020-03-22 16:49:33 · 87 阅读 · 0 评论 -
Leetcoed 32. 最长有效括号
给定一个只包含 '('和 ')'的字符串,找出最长的包含有效括号的子串的长度。示例1:输入: "(()"输出: 2解释: 最长有效括号子串为 "()"示例 2:输入: ")()())"输出: 4解释: 最长有效括号子串为 "()()"一看就是stack,注意首先push(-1)class Solution { public int longest...原创 2020-03-21 18:21:10 · 112 阅读 · 0 评论 -
Leetcode20. 有效的括号
别问,问就是stack和map给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: "()"输出: true示例 2:输入: "()[]{}"输出: true示例 3:输入: "...原创 2020-03-20 16:40:44 · 92 阅读 · 0 评论 -
leetcode3. 无重复字符的最长子串
示例 1:输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串...原创 2020-03-20 15:51:50 · 113 阅读 · 0 评论 -
Leetcode16. 最接近的三数之和
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).菜鸡做法(我)class S...原创 2020-03-19 12:08:03 · 114 阅读 · 0 评论 -
Leetcode 23. 合并K个排序链表
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[ 1->4->5, 1->3->4, 2->6]输出: 1->1->2->3->4->4->5->6/** * Definition for singly-linked list. * public cl...原创 2020-03-19 10:52:35 · 78 阅读 · 0 评论 -
leetcode238. 除自身以外数组的乘积s
给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。示例:输入: [1,2,3,4]输出: [24,12,8,6] 提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。说明: 请不要使用除法,且...原创 2020-03-18 14:29:06 · 143 阅读 · 0 评论 -
leetcode 18删除链表的倒数第n个结点
示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.如上,正常思路:链表的长度———>要删除的位置的前一个———>删除/** * Definition for singly-linked list. * public class ListNode {...原创 2020-03-18 12:24:36 · 90 阅读 · 0 评论 -
leetcode836
矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标。如果相交的面积为正,则称两矩形重叠。需要明确的是,只在角或边接触的两个矩形不构成重叠。给出两个矩形,判断它们是否重叠并返回结果。示例 1:输入:rec1 = [0,0,2,2], rec2 = [1,1,3,3]输出:true示例 2:输入:rec1 ...原创 2020-03-18 11:49:13 · 114 阅读 · 0 评论 -
leetcode刷题记录1
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -...原创 2020-03-18 11:23:04 · 118 阅读 · 0 评论 -
还是无法实现长图滑动效果
package com.example.picturetest;import androidx.annotation.RequiresApi;import androidx.appcompat.app.AppCompatActivity;import android.content.Context;import android.os.Build;import android....原创 2020-03-17 10:33:23 · 274 阅读 · 0 评论 -
马踏棋盘-失败
package Algorithm;import java.awt.Point;import java.util.ArrayList;import java.util.Arrays;public class Horse { private static int X;//列数 private static int Y;//行数 //创建数组 标记各个位置是否被访问过 pri...原创 2020-03-15 20:16:06 · 142 阅读 · 0 评论 -
尚硅谷Java数据结构学习记录37-迪杰斯特拉算法
迪杰斯特拉是找一个结点到其它所有结点的最短路径 用文字描述有点难一开始目标结点只能到达临近的点此时选择路径最小的点更新目标点到其它点的距离(因为可以经过最小的点到达其它点)在新的距离中继续找最小点package Algorithm;import java.util.Arrays;public class Dijkstra...原创 2020-03-14 20:33:33 · 400 阅读 · 2 评论 -
尚硅谷Java数据结构学习记录36-克鲁斯算法Kruskal
Kruskal算法的实质是从剩下的边中找最小的那一条,如果没有构成回路,则加入到数组中package Algorithm;import java.util.Arrays;public class Kruskal { private int edgeNum; //记录边的个数 private char[] vertexs;// 顶点数组 private int[][] matr...原创 2020-03-14 20:19:15 · 225 阅读 · 0 评论 -
尚硅谷Java数据结构学习记录35-普里(利)姆算法Prim
普里姆算法的本质是找当前结点中与新结点距离最小的新结点package Algorithm;public class Prim { public static void main(String[] args) { // TODO Auto-generated method stub //测试图是否创建ok char[] data = new char[] {'A','B',...原创 2020-03-14 19:59:24 · 252 阅读 · 0 评论 -
尚硅谷Java数据结构学习记录34- 二分查找非递归/分治/动态规划/贪心/暴力匹配/KMP
二分查找(while实现即可)easypackage Algorithm;public class BinarySearchNo { public static void main(String[] args) { // TODO Auto-generated method stub int array[] = {1,3,8,10,11,67,100}; int inde...原创 2020-03-13 19:27:55 · 212 阅读 · 0 评论 -
尚硅谷Java数据结构学习记录33- 广度深度优先算法
广度是尽可能的找同一层的结点,深度是尽可能找下一层的结点,需要设置数组记录某个结点是否被访问过,如果没有被访问过,就进行访问,注意广度需要用队列的方式完成。package graph;import java.util.ArrayList;import java.util.Arrays;import java.util.LinkedList;public class graph...原创 2020-03-13 19:09:13 · 186 阅读 · 0 评论 -
尚硅谷Java数据结构学习记录32-平衡二叉树详解
平衡二叉树的目的在于使左子树和右子树的长度差不超过1左旋转 右子树要更长,因此要向左旋转,具体见代码或下图右旋转 右旋转是根结点的左子树的左子树比根结点的右子树长,需要右旋转左旋转和右旋转往往是结合使用的,如 左子树的右子树的长度要大于根结点的右子树的长度,整体上是右旋转,但是在左子树上是要先左旋转。结果是先将根结点的左子树进行左旋转,然后发现根结点的左子...原创 2020-03-13 19:01:19 · 143 阅读 · 0 评论 -
尚硅谷Java数据结构学习记录30-赫夫曼编码
如题,使用赫夫曼的形式进行编解码目前还没有完全弄明白package huffmantree;/* * 首先将字符串转成字节数组 * 然后将字节数组转成Node你结点,node中data代表 ASCII weight表示出现的次数 * 构建赫夫曼树 * 同上篇所讲,不同的是新结点的data为null 注意新加结点的左右子结点分别是原来的 * 赫夫曼编码 如果是非叶子结点 则...原创 2020-03-13 18:51:46 · 323 阅读 · 0 评论 -
尚硅谷Java数据结构学习记录29-赫夫曼树
赫夫曼树的目的是让整个树的权值jinkenneg 小,因此需要使权值较大的靠上,权值较小的靠下package huffmantree;/* * WPL */import java.util.ArrayList;import java.util.Collections;import java.util.List;public class HuffmanTree { p...原创 2020-03-13 18:50:12 · 220 阅读 · 0 评论 -
尚硅谷Java数据结构学习记录28-线索化二叉树-中序的实现
关于线索化二叉树,现在害没完全明白(因为写不出前序和中序的线索化二叉树)package tree;/* * 有点难度的亚子 * * 前序中序后序线索化的实现 */import tree.BinaryTreeDemo.HeroNode;public class TreadedBinaryTreeDemo { public static void main(String[]...原创 2020-03-10 12:37:46 · 273 阅读 · 0 评论 -
尚硅谷Java数据结构学习记录27-二叉树结点的有序删除
删除规则:如果有左子树,则左子树代替该结点,否则右子树代替,如果左右子树都没有,则直接删除该结点package tree;public class BinaryTreeDemo { public static void main(String[] args) { // TODO Auto-generated method stub BinaryTree binaryTree ...原创 2020-03-10 12:37:37 · 161 阅读 · 0 评论 -
尚硅谷Java数据结构学习记录26-顺序存储二叉树 前序后序中序的实现
package tree;/* * 将数组前序中序后序遍历 */public class ArrayBinaryTree { public static void main(String[] args) { // TODO Auto-generated method stub int[] array = {1,2,3,4,5,6,7};//1 2 4 5 3 6 7 前...原创 2020-03-10 11:35:12 · 202 阅读 · 0 评论 -
尚硅谷Java数据结构学习记录25-哈希表的实现
实现哈希表的有序插入 思路同链表的有序插入package search;/* * 实现 了有序插入 */import java.util.Scanner;import search.HashTabDemo.Emp.HashTab;public class HashTabDemo { public static void main(String[] args) { ...原创 2020-03-08 16:39:29 · 203 阅读 · 0 评论 -
尚硅谷Java数据结构学习记录24-斐波那契算法查找
如代码package search;import java.util.Arrays;/* * 斐波那契数查找 * 同插值查找,改变mid值 * 对黄金分割法的一点点理解: * 它和插值寻找都是改变mid值,而斐波那契数列f[k] = f[k-1]+ f[k-2] * mid = low + f[k-1]-1; * 因此我们可以在查找的时候利用这两个特性,如果要查...原创 2020-03-08 16:21:33 · 145 阅读 · 0 评论 -
尚硅谷Java数据结构学习记录23-插值查找
插入查找和二分查找有相似之处,都是分成小块查找,不同点在于二分法查找Mid是固定的,但是插入查找是由公式确定的 int mid = left + (right - left)*(value - array[left])/(array[right]- array[left]);这个同样可以用于数值分析中,公式考虑到了数组的稀疏度,可以更快的找到相应的数值package...原创 2020-03-06 11:54:12 · 148 阅读 · 0 评论 -
尚硅谷Java数据结构学习记录22-二分法查找
二分查找也用到了递归的思想,不断递归查询数据。需要注意的是必须是有序数组,如果存在多个同样的值,则只会返回最小的,为解决这个问题,将返回值的类型改为list。问题:为何list无法正确返回package search;import java.util.ArrayList;import java.util.List;/* * 使用二分查找前提: 数组是有序的 */p...原创 2020-03-06 11:50:06 · 234 阅读 · 0 评论 -
尚硅谷Java数据结构学习记录21-线性查找
线性查找是最简单基本的查找方法package search;//线性查找public class SeqSearch { public static void main(String[] args) { int array[] = {1,9,11,-1,34,89}; System.out.print(Seq(array,-1)); } public static in...原创 2020-03-06 11:40:38 · 125 阅读 · 0 评论 -
尚硅谷Java数据结构学习记录20-基数算法
基数算法是设置10个桶,存放数据。从最低位开始,个位数是几就将数放在哪个桶里,此时将原数组重新按照桶的顺序放入。桶清零。第二轮从中位数开始,分别再次放入,直到得到有序数组。需要注意的是:如何获取数组中最大数的位数 int maxLength = (max + "").length();package sort;import java.util.Arrays;...原创 2020-03-06 11:38:10 · 143 阅读 · 0 评论 -
尚硅谷Java数据结构学习记录19-归并算法
注意归并算法和快速算法的区别归并是分成两组,继续分,最后合在一起。快速是(类似于跷跷板的中间位置),将数字移来移去。归并的思想还是递归package sort;import java.util.Arrays;/* * 分而治之 * 归并排序 */public class DivideSort { public static void main(String[] arg...原创 2020-03-06 11:27:19 · 145 阅读 · 0 评论 -
尚硅谷Java数据结构学习记录18-快速算法
快速算法选取数组中间的位置作为pri,将数组分为左侧和右侧两段,同时设置left和right两个指标,分别从左和右侧对pri进行比较,如果小于(左侧)大于(右侧)则继续,有大于小于的则交换,j交换后继续while,退出的while的条件是left > rightpackage sort;import java.util.Arrays;public class QuickSort...原创 2020-03-06 10:50:22 · 153 阅读 · 0 评论 -
尚硅谷Java数据结构学习记录17-希尔算法
希尔算法是将数组分成小组,不断减小小组的长度,最后将数组变为有序,三次for循环第一轮是为了找下一次循环的gap,如第一轮0和5比较,gap是5,下一轮成了0和3比较;第二次循环和第三次循环是为了进行比较 如array[i] 和array[i - gap]比较此时会有改进出现 如果array[i] > array[i - gap],后者可能比array[i-2*gap]更小,...原创 2020-03-05 15:36:05 · 126 阅读 · 0 评论