
数据结构
做图像加密的Tara
Keep learning
展开
-
和为s的两个数字
题意:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。示例1:输入:nums = [2,7,11,15], target = 9输出:[2,7] 或者 [7,2]示例2:输入:nums = [10,26,30,31,47,60], target = 40输出:[10,30] 或者 [30,10]分析:本质是在数组中查找满足等式a+b=s的元素a,b。由于数组是递增排序,则可选择二分查找。publi.原创 2021-07-15 21:53:22 · 220 阅读 · 1 评论 -
顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。思路:模拟、设定边界,清晰图解。考虑设定矩阵的“左、上、右、下”四个边界,模拟以上矩阵遍历顺序。public class Solution { public int[] spiralOrder(int[][] matrix) { if(matrix.length == 0) return new int[0]; int l = 0, r = matrix[0].length - 1, t = 0.原创 2021-07-01 23:43:00 · 188 阅读 · 2 评论 -
二叉树的镜像
思路:前序遍历交换左右子树public class Solution { public TreeNode mirrorTree(TreeNode root) { if(root == null) return null; TreeNode left = mirrorTree(root.left); TreeNode right = mirrorTree(root.right); root.left = right; .原创 2021-06-30 23:02:04 · 167 阅读 · 2 评论 -
树的子结构
判断是不是二叉树的子树public class Solution { public boolean isSubStructure(TreeNode A, TreeNode B){ if (A==null||B==null) return false; return dfs(A,B)||isSubStructure(A.left,B)||isSubStructure(A.right,B); } public boolean dfs(TreeNode原创 2021-06-29 23:15:25 · 152 阅读 · 1 评论 -
二叉树的镜像
public TreeNode mirrorTree(TreeNode root) { if (root == null) return null; TreeNode tmpNode = root.left; root.left = mirrorTree(root.right); root.right = mirrorTree(tmpNode); return ro.原创 2021-06-27 22:35:07 · 163 阅读 · 1 评论 -
合并两个排序的链表
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例输入:1->2->4, 1->3->4输出:1->1->2->3->4->4 迭代法public class Solution { public ListNode mergeTwoList(ListNode l1,ListNode l2){ //链表类问题,设置dummyHead是一个常规操作,主要是为了避免讨论头节点,不一定是头节点丢.原创 2021-06-22 21:42:19 · 148 阅读 · 1 评论 -
重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。找到根结点,然后分左右,递归。import java.util.Arrays;public class Solution { public TreeNode buildTree(int[] preorder, int[] inorder){ int n = preorder.length; //前序数组的长度 if (n == 0){ .原创 2021-06-03 21:21:28 · 139 阅读 · 0 评论 -
从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1]思路1:顺序遍历 逆序赋值放入数组。public class Solution { public int[] reversePrint(ListNode head){ //思路1 顺序遍历 但逆序赋值存在数组中 ListNode cur=head; int count=0; while(.原创 2021-06-02 22:18:01 · 127 阅读 · 0 评论 -
字符串替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = “We are happy.”输出:“We%20are%20happy.” 昏析一下最简单,最咸鱼,最快乐。直接用replace().public class Solution { public String replaceSpace(String s) { return s.replace(" ","%20"); }}2public class So.原创 2021-06-01 22:35:52 · 228 阅读 · 0 评论 -
二维数组中的查找
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[10, 13, 14, 17, 24],[18, 21, 23, 26, 30] ]给定 target = 5,返回 true。给定 .原创 2021-05-31 19:54:11 · 244 阅读 · 0 评论 -
练习一些题
1、LC1550. 存在连续三个奇数的数组给你一个整数数组 arr,请你判断数组中是否存在连续三个元素都是奇数的情况:如果存在,请返回 true ;否则,返回 false 。示例 1:输入:arr = [2,6,4,1] 输出:false 解释:不存在连续三个元素都是奇数的情况。示例 2:输入:arr = [1,2,34,3,4,5,7,23,12] 输出:true 解释:存在连续三个元素都是奇数的情况,即 [5,7,23]。class Solution { //方法一 :直接排除原创 2021-05-28 20:27:18 · 226 阅读 · 0 评论 -
Map和Set
1、Map和set是一种专门用来进行搜索的容器或者数据结构(适合动态查找),其搜索的效率与其具体的实例化子类有关。2、模型一般把搜索的数据称为关键字(Key),和关键字对应的称为值(Value),将其称之为Key-value的键 值对,所以模型会有两种:纯 key 模型,比如: 有一个英文词典,快速查找一个单词是否在词典中。 Key-Value 模型,比如: 统计文件中每个单词出现的次数,统计结果是每个单词都有与其对应的次数。3、Map中存储的就是key-value的键值对,Set中只存储了.原创 2021-05-27 19:40:44 · 148 阅读 · 0 评论 -
二叉搜索树
二叉搜索树又称二叉排序树。是空树或者具有以下性质的二叉树。1、若左子树不为空,则左子树上所有结点的值都小于根结点的值。2、若右子树不为空,则右子树上所有结点的值都大于根结点的值。3、它的左右子树也分别为二叉搜索树。public class BSTree { public Node root = null; // public void insert(int key) {//插入 if (root == null) { root =.原创 2021-05-19 20:26:29 · 148 阅读 · 0 评论 -
排序
1、排序只能应用在线性结构上,虽然链表也可以排序,但无特殊说明时,默认都是数组排序。2、排序的稳定性:保证一定不会交换相等元素的相对位置。3、内部排序依赖的存储只有内存,外部排序依赖的不仅仅是内存,还包括硬盘等持久化存储。前者数据量小,后者数据量大。4、7种基于“比较”的排序(元素之间需要具备比较的能力):插入排序,希尔排序,选择排序,冒泡排序,堆排序,快速排序,归并排序。...原创 2021-05-17 21:45:51 · 164 阅读 · 0 评论 -
Java中的优先级队列练习
import java.util.Comparator;import java.util.PriorityQueue;import java.util.Queue;public class PriorityQueueDemo { static class IntegerComparator implements Comparator<Integer> { @Override public int compare(Integer o1, Intege原创 2021-05-15 21:30:36 · 151 阅读 · 0 评论 -
堆---java
1、堆实际就是在完全二叉树的基础之上进行了一 些元素的调整。2、如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki = K2i+1 且 Ki >= K2i+2) i = 0,1,2…,则 称为 小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆...原创 2021-05-05 21:33:26 · 138 阅读 · 0 评论 -
java实现二叉树遍历并以列表返回
1、前序的两种实现(1)import java.util.ArrayList;import java.util.List;public class preorder { List<Integer> list=new ArrayList<>(); public void preorder(TreeNode root){ if (root==null){ return; } list.ad原创 2021-04-10 22:06:42 · 292 阅读 · 0 评论 -
Java实现二叉树的遍历
开局一张糊糊的图 节点public class TreeNode { public int val;//节点值 public TreeNode left;//指向该节点的左孩子 null表示无左孩子 进一步视为左子树 public TreeNode right;//指向该节点的右孩子 public TreeNode(int val) { this.val = val; } @Override public String to原创 2021-04-07 17:29:29 · 141 阅读 · 2 评论 -
二叉树理论总结---数据结构
开局一张图1、一些重要的概念节点的度:一个节点含有的子树的个数称为节点的度。A节点的度为2,在二叉树中,节点的度不超过2。 树的度:一棵树中,最大的节点的度称为树的度。同上。 叶子节点或终端节点:度为0的节点称为叶节点。如G K L。 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点。A是B和C的双亲节点。 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点。B C是A的孩子节点。 根结点:一棵树中,没有双亲结点的结点;如A。 节点的层次:从根开始定原创 2021-04-06 20:38:04 · 199 阅读 · 0 评论 -
(小练习)实现一个最小栈/实现循环队列---数据结构
实现一个最小栈要求:设计一个支持 push ,pop ,top 操作,并能在常数时间内[O(1)]检索到最小元素的栈。思路:不能遍历,一遍历就是O(n)。利用两个栈,一个放入栈元素,另一个始终放最小元素。实现:import java.util.Stack;public class MinStack { public static void main(String[] args) { MinStack stack=new MinStack(); s..原创 2021-04-03 16:06:07 · 244 阅读 · 0 评论 -
(队列&栈)用队列实现栈/用栈实现队列---数据结构
用队列实现栈要求:仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通队列的全部四种操作(push、top、pop 和 empty)说明:(1)只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。(2)所使用的语言也许不支持队列,可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。思路:操作前始终保持一个队列是空的。相互来回“倒腾”,以此达到模..原创 2021-04-02 20:42:53 · 164 阅读 · 0 评论 -
(小练习)有效的括号---数据结构
要求:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。即满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例:输入:s = “()[]{}”输出:true输入:s = “(]”输出:false输入:s = “{[]}”输出:true思路:建栈,然后将左括号入栈,与遍历字符串得到的右括号匹配,匹配成对,则出栈。当栈空,说明全都匹配,返回true。实现:import java.util.Stack;public原创 2021-04-01 22:09:06 · 149 阅读 · 0 评论 -
(Java中的双向链表)实现自己的LinkedList---数据结构
要求:实现MyLinkedList,实现LinkedList中的一些方法。实现:原创 2021-03-31 20:30:39 · 200 阅读 · 0 评论 -
Java中的链表LinkedList
public class LinkedList implements List{ public LinkedList(){...}}1、LinkedList的具备的方法,等同于List具备的方法。2、Java中的链表,不再使用头结点来代表链表,而是定义了一个链表类来表示链表。3、Java中的链表采用的是一种双向链表。4、Java中的链表既保存了链表的头结点,也保存了链表的尾结点。常用方法:import java.util.LinkedList;publi..原创 2021-03-28 22:02:50 · 165 阅读 · 0 评论 -
(链表练习)相交链表---数据结构
要求:找到两个单链表相交的起始节点。注意:这里相交结点的值为8,为什么不是1呢?因为所谓结点相交,需要满足结点相等(指向同一对象),而不只是结点值相等。思路:以相交后的长度相等为基准,做比较。实现:public class getIntersectionNode { public static void main(String[] args) { ListNode head1=new ListNode(4); ListNode n2=new ListN原创 2021-03-26 10:43:12 · 128 阅读 · 0 评论 -
(链表练习)链表的回文结构---数据结构
要求:对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。测试样例:1->2->2->1返回:true实现:public class Partition { public static ListNode partition(ListNode pHead, int x) { ListNode lastA = n原创 2021-03-24 20:26:49 · 99 阅读 · 0 评论 -
(栈和队列)栈(Stack)---数据结构
1、概念:栈是一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作。2、相关概念: 栈顶/栈底:进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。 LIFO:栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈:栈的删除操作叫做出栈,出数据在栈顶。3、实现 (1)利用顺序表实现,即使用尾插 + 尾删的方式实现。 (2)...原创 2021-03-23 22:20:08 · 122 阅读 · 0 评论 -
(剑指offer)去掉链表中重复的结点---数据结构
要求:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表1->2->3->3->4->4->5 处理后为 1->2->5实现:public class DeleteDuplication { public static void main(String[] args) { ListNode n1=new ListNode(1); ListNode n2=ne原创 2021-03-20 20:33:04 · 141 阅读 · 0 评论 -
(链表练习)链表按指定值分割排序---数据结构
要求:现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。实现:public static ListNode partition(ListNode pHead,int x){ if(pHead == null){ return null; } ListNode small = new ListNode(-1);原创 2021-03-18 19:57:12 · 215 阅读 · 0 评论 -
(链表练习)合并两个有序链表---数据结构
要求:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:实现:public class MergeTwoLists { public static void main(String[] args) { ListNode n1=new ListNode(7); ListNode n2=new ListNode(8); ListNode n3=new ListNode(9); L原创 2021-03-17 17:15:33 · 275 阅读 · 0 评论 -
(链表练习)输出链表中倒数第K个结点---数据结构
要求:输入一个链表,输出该链表中倒数第K个结点。实现:public class FindKthToTail { public static void main(String[] args) { ListNode n1=new ListNode(1); ListNode n2=new ListNode(2); ListNode n3=new ListNode(3); ListNode n4=new ListNode(4);原创 2021-03-16 14:50:12 · 146 阅读 · 0 评论 -
(链表练习)返回链表中间结点---数据结构
要求:给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点实现:1、从head开始,走一长度的一半。package pracLinkedList;public class MiddleNode { public static void main(String[] args) { ListNode n1=new ListNode(1); ListNode n2=new ListNode(2);原创 2021-03-15 14:46:04 · 259 阅读 · 0 评论 -
(链表练习)反转一个单链表---数据结构
示例:输入:1->2->3->4->5->null输出:5->4->3->2->1->null实现:package pracLinkedList;public class ReverseList { public static void main(String[] args) { ListNode n1=new ListNode(1); ListNode n2=new ListNode(2);原创 2021-03-14 13:32:29 · 175 阅读 · 0 评论 -
(链表练习)删除链表中等于给定值val的所有结点--数据结构
package pracLinkedList;public class RemoveElements { public static void main(String[] args) { ListNode n3=new ListNode(3);//手动创建 ListNode n2=new ListNode(2); ListNode n5=new ListNode(5); ListNode n=new ListNode(2); .原创 2021-03-13 19:12:11 · 153 阅读 · 0 评论 -
线性表之链表---数据结构
1、原理元素:真实存在于线性表中的内容,是我们关心的核心内容。结点:为了组织链表而引入的结构,除了保存元素,还保存指向下一个结点的引用。其中尾结点的next==null.链表:最终的线性表,表示逻辑上的[2 4 2]。 目前通过链表的头结点(head)来代表一整条链表,因为通过head可以找到所有的结点。 某条链表的头结点是null,表示头结点不存在,进一步可以表示是一条没有头结点的链表,也就是一条空链表。当前结点(current/cur):表...原创 2021-03-12 14:15:31 · 199 阅读 · 0 评论 -
实现ArrayList类---数据结构
1、MyList接口package MyArrayList;public interface MyList { boolean add(Integer e); void add(int index, Integer e); Integer remove(int index); boolean remove(Integer e); Integer get(int index); Integer set(int index,Integer e); b原创 2021-03-11 18:42:49 · 147 阅读 · 0 评论 -
线性表---数据结构
1、线性表(linear list)是n个具有相同特性的数据元素的有限序列。 常见的线性表有顺序表、链表、栈、队列、字符串等。2、线性表在逻辑上是线性结构,但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。 (1)顺序表在逻辑上是线性的,在内存中存储时,也是严格按照逻辑上的次序保存起来的。 (2)链表在逻辑上是线性的,在内存中存储时,不保证连续性。3、区分容量(capacity) 和元素个数(size):线性表的所有下标只和元素个数有...原创 2021-03-10 21:51:36 · 220 阅读 · 0 评论 -
(顺序表练习)Java扑克牌游戏---数据结构
要求:1、通过ArrayList实现一幅不含大小王的扑克牌。2、实现洗牌功能。3、给三名玩家各自发五张牌。思路:1、定义“牌”类,该类的每一个对象都表示是一张牌。2、洗牌,在下标为[0,i)范围内随机生成一个位置,与下标为i的元素交换。3、发牌,实现:1、定义“牌”类import java.util.Objects;public class Card { private final int rank;//定义牌面范围1-13 private final String原创 2021-03-06 16:41:58 · 422 阅读 · 0 评论