# 记录和总结数据结构与算法相关内容
###主要实践为leetcode,剑指offer,各大公司笔试,面试题。
本仓库主要用于学习数据结构与算法,同时作为笔试、面试刷题积累,主要用于提升自身的编程能力。在自己思考的基础之上融入高手们的编程思想,做好详细记录。
## 如何写出正确的程序? ##
- 明确变量的含义
- 循环不变量
- 小数据量调试
- 大数据量的测试
## 时间复杂度分析与空间复杂度分析
增加一个文件夹leetcode,用于记录数据结构与算法相关的完成代码。主要分为Array,链表,栈,队列,二叉树,图,排序,递归,贪心,分治,动态规划,回溯。
# 一、数组 #
数组是一种**线性表数据结构**,用一组**连续的内存空间**来存储一组具有**相同类型**的数据。其最大特点是**支持随机访问**,但删除,插入操作低效。
数组在定义时需要预先指定大小,因为需要分配连续的内存空间。
Java中的ArrayList支持动态扩容,当存储空间不够时,其空间自动扩容为1.5倍大小。
数组和链表的区别?
数组按照下标访问时,其时间复杂度是O(1),插入元素的时间复杂度是O(n),链表适合插入和删除数据,时间复杂度为O(1)。
## 数组的基本操作 ##
- Insert--在指定索引插入一个元素
- Get--返回指定索引的元素
- Delete--删除指定索引位置的元素
- Size--数组所有元素的数量
## 数组常见问题 ##
- 二分查找,注意二分查找的实现
- 寻找数组中的第二小的元素
- 找到数组中第一个不重复出现的整数
- 合并两个有序数组
- 重新排列数组中的正值和负值
- 连续子数组的和
- 顺时针打印矩阵
leetcode 283. Move Zeroes
leetcode 27. Remove Element
leetcode 26. Remove Duplicates from Sorted
letcode 80. Remove Duplicates from Sorted Array II
leetcode 75. Sort Colors
leetcode 88. Merge Sorted Array
leetcode 215. Kth Largest Element in an Array
leetcode 125. Valid Palindrome
leetcode 345. Reverse Vowels of a String
leetcode 11. Container With Most Water
34. 在排序数组中查找元素的第一个和最后一个位置
## 双索引技术 ##
15. 三数之和
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
Arrays.sort(nums);
for(int i=0;i<=nums.length-2;i++){
if(i>0 && nums[i]==nums[i-1]){
continue;
}
//设置双指针
int left = i+1;
int right = nums.length-1;
while(left<right){
if(nums[i] + nums[left] +nums[right] < 0){
left++;
}
else if(nums[i] + nums[left] +nums[right] > 0){
right--;
}
else{
res.add(Arrays.asList(nums[i],nums[left],nums[right]));
//防止相等元素,导致结果重复
while(left < nums.length-1 && nums[left] == nums[left+1]){
left++;
}
//防止相等元素,导致结果重复
while(right > 0 && nums[right] == nums[right-1]){
right--;
}
left++;
right--;
}
}
}
return res;
}
}
leetcode 209. Minimum Size Subarray Sum
## 滑动窗口法。
leetcode 3. Longest Substring Without
leetcode 438.Find All Anagrams in a String
leetcode 76. Minimum Window Substring
## 二分查找(运行效率还不如for循环)
34. 在排序数组中查找元素的第一个和最后一个位置
public int[] searchRange(int[] nums, int target) {
if(nums.length==0||nums == null){
return new int[]{-1,-1};
}
int start = findFirst(nums,target);
if( start == -1){
return new int[]{-1,-1};
}
return new int[]{start,findLast(nums,start,target)};
}
public int findFirst(int[] nums,int target){
int left = 0;
int right = nums.length-1;
while(left < right){
int mid = left + (right-left)/2;
if(nums[mid]==target){
right = mid;
}
else if(nums[mid]<target){
left = mid+1;
}else{
right = mid-1;
}
}
return nums[left] == target? left:-1;
}
public int findLast(int[] nums,int num,int target){
int left = num;
int right = nums.length-1;
while(left < right){
int mid = left + (right-left+1)/2;
if(nums[mid]==target){
left = mid;
}
else if(nums[mid]<target){
left = mid+1;
}else{
right = mid-1;
}
}
return nums[left] == target? left:-1;
}
class Solution {
public int[] searchRange(int[] nums, int target) {
int first = -1;
int i = 0;
for(;i<nums.length;i++){
if(nums[i] == target){
first = i;
break;
}
}
if(first == -1){
return new int[]{-1,-1};
}
int count = -1;
for(int j = i;j<nums.length;j++){
if(nums[j] == target){
count++;
}
}
return new int[]{first,first+count};
}
}
# 二、链表 #
链表包括单链表、双向链表以及循环链表
## 链表的基本操作 ##
- InsertAtEnd 在链表的尾部插入指定元素
- InsertAtHead 在链表的头部插入指定元素
- Delete 从链表删除指定元素
- DeleteAtHead 删除链表的第一个元素
- Search 从链表中返回指定元素
- isEmpty 如果链表为空,则返回true
## 链表常见问题 ##
- 1.反转链表
- 2.检查链表中的循环
- 3.返回链表中倒数第N个节点
- 4.删除链表中的重复项
-5合并两个排序的链表
# 三、查找表 #
map+set
350. 两个数组的交集 II
242. 有效的字母异位词
202. 快乐数
290. 单词模式
205. 同构字符串
451. 根据字符出现频率排序
1. 两数之和
15. 三数之和
16. 最接近的三数之和
454. 四数相加 II
18. 四数之和
49. 字母异位词分组
447. 回旋镖的数量
## 滑动窗口+查找表
219. 存在重复元素 II
217. 存在重复元素
220. 存在重复元素 III
# 四、栈 #
LIFO(后进先出)
## 栈的基本操作 ##
- Push 在栈顶插入一个元素
- Pop 返回并移除栈顶元素
- isEmpty 若栈为空,则返回true
- Top 返回顶部元素,但并不移除
## 栈常见问题 ##
- 1.使用栈计算后缀表达式
- 2.对栈元素进行排序
- 3.判断表达式是否括号平衡
- 4.包含min函数的栈
-5 栈的压入和弹出
# 五、队列 #
FIFO(先进先出)
## 队列的基本操作 ##
- Enqueue 在队列尾部插入元素
- Dequeue 在移除队列头部的元素
- isEmpty 如果队列为空则返回true
- Top 返回队列第一个元素
## 队列常见问题 ##
- 1.使用队列表示栈
- 2.对队列的前K个元素倒序
- 3.使用队列生成1~n的二进制数
- 4.用两个栈实现队列
##附加:跳表(Redis利用跳表实现有序集合Sorted Set)
# 六、树 #
树形结构是一种层次式的数据结构,由顶点和边组成,但不存在回路
## 树形结构的主要类型包括 ##
- N元树
- 平衡树
高度差小于1
## 二叉树
114. 二叉树展开为链表
class Solution {
TreeNode prev = null;
public void flatten(TreeNode root) {
if(root == null){
return;
}
flatten(root.right);//先递归到最右边,在回溯
flatten(root.
没有合适的资源?快使用搜索试试~ 我知道了~
每天坚持两道题,整理数据结构与算法相关代码.zip
共401个文件
java:130个
class:121个
txt:61个
需积分: 2 0 下载量 56 浏览量
2024-01-14
12:42:12
上传
评论
收藏 7.92MB ZIP 举报
温馨提示
算法与数据结构它们分别涵盖了以下主要内容: 数据结构(Data Structures): 逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何具体存储。例如,数组的连续存储,链表的动态分配节点,树和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法: 算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生唯一的确定输出。 算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法,分支限界法等。 算法分析:通过数学方法分析算法的时间复杂度(运行时间随数据规模增长的速度)和空间复杂度(所需内存大小)来评估其效率。 学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
资源推荐
资源详情
资源评论
收起资源包目录
每天坚持两道题,整理数据结构与算法相关代码.zip (401个子文件)
215. Kth Largest Element in an Array 551B
4. 两个排序数组的中位数 877B
445. 两数相加 II 1KB
704. 二分查找 859B
563. 二叉树的坡度 1009B
637. 二叉树的层平均值 2KB
107. 二叉树的层次遍历 II 2KB
257. 二叉树的所有路径 1KB
104. 二叉树的最大深度 2KB
111. 二叉树的最小深度 1KB
543. 二叉树的直径 1008B
859. 亲密字符串 1KB
19. 删除链表的倒数第N个节点 2KB
92. 反转链表 II 998B
136. 只出现一次的数字 915B
872. 叶子相似的树 2KB
617. 合并二叉树 1KB
9. 回文数 734B
219. 存在重复元素 II 790B
507. 完美数 579B
101. 对称二叉树 1KB
108. 将有序数组转换为二叉搜索树 1KB
404. 左叶子之和 889B
633. 平方数之和 301B
110. 平衡二叉树 841B
202. 快乐数 770B
240. 搜索二维矩阵 II 1KB
53. 最大子序和 817B
155. 最小栈 742B
14. 最长公共前缀 904B
687. 最长同值路径 1KB
242. 有效的字母异位词 2KB
367. 有效的完全平方数 335B
20. 有效的括号 2KB
844. 比较含退格的字符串 1KB
11. 盛最多水的容器 2KB
100. 相同的树 2KB
226. 翻转二叉树 1019B
728. 自除数 992B
707. 设计链表 4KB
112. 路径总和 2KB
876. 链表的中间结点 1KB
172. 阶乘后的零 394B
238. 除自身以外数组的乘积 889B
Sort.class 4KB
ReadGraph.class 4KB
Path.class 3KB
SparseGraph.class 3KB
DenseGraph.class 2KB
SerializeandDeserializeBinaryTree297.class 2KB
BinaryTree.class 2KB
AddTwoNumbers.class 2KB
PathSumII113.class 2KB
DecodeString394$Solution.class 2KB
RemoveInvalidParentheses301.class 2KB
ImplementTrie208.class 2KB
GroupAnagrams49.class 2KB
Component.class 2KB
IntersectionofTwoArrays349.class 2KB
MaximalRectangle85.class 2KB
Trie.class 2KB
MinimumWindowSubstring76.class 2KB
MyLinkedList.class 2KB
HeapSort$MaxHeap.class 2KB
FindAllAnagramsinaString438.class 2KB
BinaryTreePaths257.class 2KB
LRUCache147.class 2KB
ArrayQueue.class 2KB
BallInPackage.class 2KB
LongestValidParentheses32.class 2KB
MergekSortedLists23.class 1KB
LinkedStack.class 1KB
WordBreak139.class 1KB
MergeIntervals56.class 1KB
LargestRectangleInHistogram84.class 1KB
LongestPalindromicSubstring5.class 1KB
Subsets78.class 1KB
GenerateParentheses22.class 1KB
LinkedQueue.class 1KB
LowestCommonAncestorofaBinaryTree236$Solution.class 1KB
CharOfFirst.class 1KB
MergekSortedLists23$1.class 1KB
SortList148.class 1KB
solution.class 1KB
ImplementTrie208$Node.class 1KB
FindFirstandLastPositionofElementinSortedArray34.class 1KB
HeapSort.class 1KB
ArrayStack.class 1KB
KthSmallestElementinaBST230.class 1KB
SubarraySumEqualsK560.class 1KB
LongestSubstringWithoutRepeatingCharacters3.class 1KB
QueueReconstructionbyHeight406.class 1KB
LookingforChange.class 1KB
QueueReconstructionbyHeight406$1.class 1KB
SearchinRotatedSortedArray33.class 1KB
MergeSort.class 1024B
EditDistance72.class 1023B
PrintListFromTailToHead3.class 1020B
ReConstructBinaryTree4.class 1012B
MaximumProductSubarray152$Solution.class 986B
共 401 条
- 1
- 2
- 3
- 4
- 5
资源评论
极致人生-010
- 粉丝: 2976
- 资源: 2825
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功