
数据结构与算法
数据结构与算法java实现
layla:)
这个作者很懒,什么都没留下…
展开
-
459. 重复的子字符串
力扣刷题原创 2022-09-15 20:58:11 · 227 阅读 · 0 评论 -
48. 旋转图像—原地交换
48. 旋转图像—原地交换原创 2022-08-31 21:27:31 · 114 阅读 · 0 评论 -
136. 只出现一次的数字—异或运算
136. 只出现一次的数字—异或运算原创 2022-08-31 20:14:18 · 121 阅读 · 0 评论 -
面试题—华为机试之知识点补充
华为机试原创 2022-06-05 20:20:00 · 203 阅读 · 0 评论 -
笔试题—华为机试~待续
华为机试原创 2022-06-05 20:19:32 · 140 阅读 · 0 评论 -
算法初探 —— 排序 & 查找 & Arrays类
一.排序冒泡排序:(两种)两两比较,找到最大值或者最小值的方式选择排序:(两种)每次找到最小值,将它交换到对应的位置(第一位)插入排序:默认第一个是有序的,第二个开始,向有序进行插入1.1冒泡排序package com.openlab.day08.sort;public class TestSort { public static void main(String[] args) { int[] arr = {1, 2, 9, -100, -55, 23, -99, 0, .原创 2021-07-16 16:13:39 · 134 阅读 · 0 评论 -
2021-10-14 30. 包含 min 函数的栈(辅助栈)
解题思路普通栈的 push() 和 pop() 函数的复杂度为 O(1)O(1) ;而获取栈最小值 min() 函数需要遍历整个栈,复杂度为 O(N)O(N) 。**本题难点: **将 min() 函数复杂度降为 O(1)O(1) ,可通过建立辅助栈实现;- 数据栈 AA : 栈 AA 用于存储所有元素,保证入栈 push() 函数、出栈 pop() 函数、获取栈顶 top() 函数的正常逻辑。- 辅助栈 BB : 栈 BB 中存储栈 AA 中所有 非严格降序 的元素,则栈 AA 中的最小元素始终对原创 2021-10-14 08:06:28 · 96 阅读 · 0 评论 -
第3章动态链表_单向循环链表的应用之逢七过
逢7过小游戏package P3.链式结构;import P2.线性结构.ArrayList;import java.util.Scanner;//逢七过游戏/*输入玩家的个数输入从哪个玩家开始输入该玩家从哪个数字开始输入一共玩几个游戏打印出每个玩家将要报出的所有数字* */public class SevenGame { public static void main(String[] args) { Scanner input = new Sca.原创 2022-01-15 17:34:21 · 2264 阅读 · 0 评论 -
数据结构初级
一.线性表1.线性表的顺序存储#define MAXSIZE 100 typedef int ElemType; typedef struct{ ElemType elem[MAXSIZE]; int last; }SqeList;//插入#define OK 1#define ERROR 0int InsList(SqeList*L,int i,Elemtype e) { int k; if(i<1)||(i>L->last原创 2020-12-06 14:37:11 · 212 阅读 · 0 评论 -
查找问题中的分治算法——选择问题
目录一、问题描述二、分治策略三、算法举例四、复杂度一、问题描述二、分治策略三、算法举例四、复杂度时间复杂度是O(n^2)(worst)O(n)(best)原创 2021-10-11 17:39:15 · 205 阅读 · 0 评论 -
排序问题中的分治算法——归并排序
目录一、问题描述二、分治策略三、算法举例四、复杂度一、问题描述应用归并排序方法对一个规模为n的记录序列进行升序排序.排序数组a[0:n-1]待排序区间[left,right]二、分治策略1)划分:将要排序序列划分为两个长度大致相等的子序列如果,left=right只有一个,无需排序,算法结束否则,计算划分中的:mid=(left+right)/22)求解子问题对前半个子序列a[0]~a[mid]进行升序排序对后半个子序列a[mid+1]~a[right]进行升序排序3)合并归并两原创 2021-10-11 16:42:21 · 160 阅读 · 0 评论 -
查找问题中的分治算法——折半查找
目录一、问题描述二、分治策略三、算法举例四、复杂度五、二叉判定树一、问题描述在一个含有N个元素的有序序列中查找值为x的记录。二、分治策略折半查找是在元素有序的前提下,否则结果出差三、算法举例四、复杂度时间复杂度始终是O(nlog2n)五、二叉判定树这个老师会发PPT再补充...原创 2021-10-11 17:26:28 · 646 阅读 · 0 评论 -
排序问题中的分治算法——快速排序
目录一、问题描述二、分治策略三、算法举例四、复杂度一、问题描述应用归并排序方法对一个规模为n的记录序列进行升序排序.二、分治策略1)划分:在要排序的序列中任意选定一个元素a[i]作为划分元素,也称主元。2)求解子问题通过递归调用快速排序算法分别对左子序列,和右子序列进行排序。方法一:两路归并方法二:一路归并3)合并由于左子序列和右子序列的排序是就地进行,所以无需归并。三、算法举例方法一:两路归并方法二:一路归并四、复杂度时间复杂度始终是O(nlog2n)(最好情况)原创 2021-10-11 17:10:29 · 301 阅读 · 0 评论 -
2021-10-11分治算法
目录一.分治算法的基本思想二.分治法解题的一般步骤三、分治法思想的一些经典问题一.分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题结构相同。求出子问题的解,就可得到原问题的解。二.分治法解题的一般步骤(1)分解,将要解决的问题划分成若干规模较小的同类问题;(2)求解,当子问题划分得足够小时,用较简单的方法解决;(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。它的一般的算法设计模式如下:Divide-and-Conquer(P)原创 2021-10-11 16:13:16 · 302 阅读 · 0 评论 -
2021-10-20 剑指 Offer 24. 反转链表(迭代 / 递归)
方法一:迭代(双指针)考虑遍历链表,并在访问各节点时修改 next 引用指向,算法流程见注释。复杂度分析:时间复杂度 O(N):遍历链表使用线性大小时间。空间复杂度 O(1):变量 pre 和 cur 使用常数大小额外空间。class Solution { public ListNode reverseList(ListNode head) { ListNode cur = head, pre = null; while (cur != null).原创 2021-10-20 22:08:03 · 104 阅读 · 0 评论 -
2021-07-29 LeetCode215:
Java中compareTo()方法详解方法一:大根堆官网答案超详细题解堆这种数据结构 Java实现多种思路原创 2021-07-29 22:45:15 · 72 阅读 · 0 评论 -
2021-10-14 06. 从尾到头打印链表(递归法、辅助栈法)
解题思路方法一:辅助栈:代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public int[] reversePrint(ListNode head) { LinkedList&l原创 2021-10-14 19:07:04 · 288 阅读 · 0 评论 -
2021-10-20 面试题05. 替换空格 (字符串修改)
class Solution { public String replaceSpace(String s) { StringBuilder res = new StringBuilder(); for(Character c : s.toCharArray()){ if(c==' ') res.append("%20"); else res.append(c); } return r...原创 2021-10-20 22:23:19 · 87 阅读 · 0 评论 -
2021-11-06 剑指 Offer 03. 数组中重复的数字(哈希表)
方法一:哈希表 / Set利用数据结构特点,容易想到使用哈希表(Set)记录数组的各个数字,当查找到重复数字则直接返回。算法流程:1.初始化: 新建 HashSet ,记为 dic ;2.遍历数组 nums 中的每个数字 num :a.当 num 在 dic中,说明重复,直接返回 num ;b.将 num添加至 dic 中;3.返回 -1 。本题中一定有重复数字,因此这里返回多少都可以。复杂度分析:时间复杂度 O(N)O(N) : 遍历数组使用 O(N)O(N) ,HashSet 添加与.原创 2021-11-06 09:49:48 · 122 阅读 · 0 评论 -
563.二叉树的坡度(递归)
解法一:1.算法思想:递归,根据【坡度】的定义,可以直接写出对应的递归实现。2.代码时间复杂度:每个节点被访问的次数与其所在深度有关。复杂度为 O(n^2)O(n 2 )空间复杂度:忽略递归来带的额外空间消耗。复杂度为O(1)O(1)/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode righ..原创 2021-11-18 16:23:10 · 459 阅读 · 0 评论 -
2021-07-27
原创 2021-07-27 14:40:56 · 90 阅读 · 0 评论 -
我的刷题日记
LeetCode283. 移动零——快慢指针原创 2021-10-11 18:20:49 · 130 阅读 · 0 评论 -
2021-10-14 09. 用两个栈实现队列
解题思路栈无法实现队列功能:栈底元素(对于队首元素)无法直接删除,需要将上方所有元素出栈。双栈可实现列表倒序: 设有含三个元素的栈 A = [1,2,3]A=[1,2,3] 和空栈 B = []B=[]。若循环执行 AA 元素出栈并添加入栈 BB ,直到栈 AA 为空,则 A = []A=[] , B = [3,2,1]B=[3,2,1] ,即 栈 BB 元素实现栈 AA 元素倒序 。利用栈 B 删除队首元素: 倒序后,BB 执行出栈则相当于删除了 AA 的栈底元素,即对应队首元素。函数设计:原创 2021-10-14 18:32:29 · 86 阅读 · 0 评论 -
LeetCode136:
官网解答多种思路思路一:异或原创 2021-07-30 13:28:34 · 77 阅读 · 0 评论 -
2021-10-20 面试题58 - II. 左旋转字符串(切片 / 列表 / 字符串)
解题思路由于本题的多解法涉及到了 字符串为不可变对象 的相关概念,导致效率区别较大。因此,单列一节 三种方法的效率分析 ,望对各位有所帮助。方法一:字符串切片应用字符串切片函数,可方便实现左旋转字符串。获取字符串 s[n:]s[n:] 切片和 s[:n]s[:n] 切片,使用 “++” 运算符拼接并返回即可。复杂度分析:时间复杂度 O(N) : 其中 NN 为字符串 ss 的长度,字符串切片函数为线性时间复杂度(参考资料);空间复杂度O(N) : 两个字符串切片的总长度为 NN 。.原创 2021-10-20 21:43:52 · 168 阅读 · 0 评论 -
2021-10-16 35.复杂链表的复制-----HashMap
class Solution { public Node copyRandomList(Node head) { //边界判断,一般链表的题目都需要判断头节点是否为空 //从链表的头节点开始遍历 //使用一一对应的哈希表结构 Map 存放已经创建的节点 //1遍历原链表 //以原链表的节点为 Key ,创建一个 Map //Map 的 Value 为一个新链表中的节原创 2021-10-16 23:21:12 · 119 阅读 · 0 评论 -
剑指 Offer 14- I. 剪绳子 (数学推导/动态规划)
解法一:数学推导1.解题思路:题意:将长度为n的绳子切为a段n=n1+n2+n3+…+na求解 max(n1n2n3*…na)小推论:1.当所有绳子长度相等时乘积最大2.最优的绳段长度为3证明推论2.算法流程3.代码class Solution { public int cuttingRope(int n) { if (n <= 3) return n-1; int a = n / 3,b = n % 3; if (b =原创 2021-11-17 18:27:24 · 205 阅读 · 0 评论 -
LeetCode198:
动态规划—滚动数组原创 2021-07-30 14:12:29 · 86 阅读 · 0 评论 -
力扣 #287寻找重复数
1.异或2.setHashTable、HashSet和Dictionary的区别原创 2021-09-12 15:08:48 · 103 阅读 · 0 评论 -
2073.买票需要的时间
解题思路:将数组分成两份来看待,一份是下标小于等于k的,一份是大于k的。小于等于k的部分:因为这一部分买票人是站在k这个人的前面:1.假如前面的人买的票数大于等于k这个人,则耽误的时间与k这个人买票数相等。2.假如前面的人买的票数少于k这个人,那么耽误的时间等于前面这个人本身买的票数。大于k的部分:因为这一部分买票人是站在k这个人的后面:1.假如后面的人买的票数大于等于k这个人,则耽误的时间与k这个人买票数-1相等(减1是因为:当k这个人买完时就离开了,就不用管后面的人了)。2.假如后面.原创 2021-11-18 16:59:40 · 217 阅读 · 0 评论 -
LeetCode02:两数相加
官网链表Java基础–单链表基本结构跟操作Java–链表定义结构常考算法-----链表总结链表好文章!!逐位相加【加法模板】秒杀所有逐位相加 数组形式的整数加法Java运算符及优先级 方法一:数组...原创 2021-07-22 21:45:11 · 136 阅读 · 0 评论 -
LeetCode01:两数之和(易)
方法一:暴力求解(枚举法)原创 2021-07-18 18:49:00 · 102 阅读 · 0 评论 -
LeetCode62&63:棋盘&动态规划
待刷:剑指 Offer 46. 把数字翻译成字符串」、「70. 爬楼梯」「221. 最大正方形」、「1162. 地图分析」等LeetCode62:一级目录某个人进入如下一个棋盘中,要求从左上角开始走,最后从右下角出来(要求只能前进,不能后退),问题:共有多少种走法?LeetCode63:方法一:动态规划优化:「滚动数组思想」是一种常见的动态规划优化方法,在我们的题目中已经多次使用到,例如「剑指 Offer 46. 把数字翻译成字符串」、「70. 爬楼梯」等,当我们定义的状态在动态.原创 2021-07-17 22:01:36 · 215 阅读 · 1 评论 -
第4章分治回溯_01节_递归与分治之二分查找
package p4.分治回溯;public class RecursionDemo04 { private static int count = 0; public static void main(String[] args) { //二分查找 折半查找 int[] arr = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; int index = binarySearch(arr,0, arr.lengt原创 2022-01-22 16:33:29 · 369 阅读 · 0 评论 -
Leetcode142. 环形链表 II
142. 环形链表 IIpackage p3.链式结构;public class Solution142 { public ListNode detectCycle(ListNode head) { if (head == null || head.next == null) { return null; } ListNode slow = head; ListNode fast = head;原创 2022-01-22 16:27:06 · 77 阅读 · 0 评论 -
Leetcode141. 环形链表
141. 环形链表package p3.链式结构;public class Solution141 { public boolean hasCycle(ListNode head) { if (head == null || head.next == null) { return false; } ListNode p = head; ListNode q = head; while (q.原创 2022-01-22 16:26:02 · 175 阅读 · 0 评论 -
Leetcode83. 删除排序链表中的重复元素
83. 删除排序链表中的重复元素package p3.链式结构;public class Solution83 { public ListNode deleteDuplicates(ListNode head) { if (head == null || head.next == null) { return head; } ListNode left = head; ListNode right = le原创 2022-01-22 16:25:08 · 165 阅读 · 0 评论 -
Leetcode82. 删除排序链表中的重复元素 II
题目描述:82. 删除排序链表中的重复元素 IIpackage p3.链式结构;public class Solution82 { public ListNode deleteDuplicates(ListNode head) { if (head == null || head.next == null) { return head; } ListNode dummy = new ListNode(0);原创 2022-01-22 16:24:05 · 59 阅读 · 0 评论 -
Leetcode19. 删除链表的倒数第 N 个结点
package p3.链式结构;public class Solution19 { public ListNode removeNthFromEnd(ListNode head, int n) { if (head == null || head.next == null) { return null; } ListNode right = head; ListNode left = head; .原创 2022-01-22 16:22:17 · 74 阅读 · 0 评论 -
第2章动态数组_08节_循环队列的实现
循环队列ArrayLoopQueuepackage p2.线性结构;import p1.接口.Queue;import java.util.Iterator;//循环队列public class ArrayLoopQueue<E> implements Queue<E> { private E[] data; //存储数据的容器 private int front; //队首指针(实际上就是数组中的索引角标) private int re.原创 2022-01-22 15:59:02 · 71 阅读 · 0 评论