![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构-算法笔记
Kopoo_
这个作者很懒,什么都没留下…
展开
-
剑指offer二刷(精刷)
剑指 Offer 03. 数组中重复的数字题目描述在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。Input:{2, 3, 1, 0, 2, 5}Output:2解题思路要求时间复杂度 O(N),空间复杂度 O(1)。因此不能使用排序的方法,也不能使用额外的标记数组。对于这种数组元素在 [0, n-1] 范围内的问题,可以将值为 i 的元素调整到原创 2020-12-19 21:12:52 · 410 阅读 · 1 评论 -
Leedcode算法专题训练(位运算)
https://www.cnblogs.com/findbetterme/p/10787118.html看这个就完事了1. 统计两个数的二进制表示有多少位不同461. Hamming Distance (Easy)Leetcode/力扣class Solution { public int hammingDistance(int x, int y) { int z=x^y; int cnt=0; while(z!=0){ ..原创 2020-12-09 17:24:03 · 134 阅读 · 0 评论 -
Leedcode算法专题训练(数组与矩阵)
1. 把数组中的 0 移到末尾283. Move Zeroes (Easy)Leetcode/力扣class Solution { public void moveZeroes(int[] nums) { int id=0; for(int num:nums){ if(num!=0)nums[id++]=num; } while(id<nums.length){ n..原创 2020-12-05 22:12:35 · 122 阅读 · 0 评论 -
Leedcode算法专题训练(数学)
204. 计数质数难度简单523统计所有小于非负整数n的质数的数量。class Solution { public int countPrimes(int n) { boolean[] noPrimes=new boolean[n]; int count=0; for(int i=2;i<n;i++){ if(noPrimes[i]) continue; ..原创 2020-12-03 11:02:26 · 90 阅读 · 0 评论 -
Leedcode算法专题训练(字符串)
4. 两个字符串包含的字符是否完全相同242. Valid Anagram (Easy)Leetcode/力扣可以用 HashMap 来映射字符与出现次数,然后比较两个字符串出现的字符数量是否相同。由于本题的字符串只包含 26 个小写字符,因此可以使用长度为 26 的整型数组对字符串出现的字符进行统计,不再使用 HashMap。class Solution { public boolean isAnagram(String s, String t) { in..原创 2020-12-03 10:37:12 · 97 阅读 · 0 评论 -
Leedcode算法专题训练(哈希表)
Java 中的HashSet用于存储一个集合,可以查找元素是否在集合中。如果元素有穷,并且范围不大,那么可以用一个布尔数组来存储一个元素是否存在。例如对于只有小写字符的元素,就可以用一个长度为 26 的布尔数组来存储一个字符集合,使得空间复杂度降低为 O(1)。Java 中的HashMap主要用于映射关系,从而把两个元素联系起来。HashMap 也可以用来对元素进行计数统计,此时键为元素,值为计数。和 HashSet 类似,如果元素有穷并且范围不大,可以用整型数组来进行统计。在对一个内容进行压缩...原创 2020-12-01 11:29:38 · 164 阅读 · 2 评论 -
Leedcode算法专题训练(栈和队列)
1. 用栈实现队列232. Implement Queue using Stacks (Easy)Leetcode/力扣class MyQueue { Stack<Integer> stack1=new Stack<>(); Stack<Integer> stack2=new Stack<>(); /** Initialize your data structure here. */ public MyQue..原创 2020-11-30 19:21:10 · 123 阅读 · 1 评论 -
Leedcode算法专题训练(树)
1. 树的高度104. Maximum Depth of Binary Tree (Easy)Leetcode/力扣class Solution { public int maxDepth(TreeNode root) { if(root==null)return 0; return Math.max(maxDepth(root.left),maxDepth(root.right))+1; }}2. 平衡树110. Balanced..原创 2020-11-13 10:57:14 · 261 阅读 · 0 评论 -
Leedcode算法专题训练(链表)
1.发现两个链表的交点160.两个链表的交集(容易)Leetcode/力扣public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode curA=headA; ListNode curB=headB; while(curA!=curB){ if(curA==null){.原创 2020-11-11 11:22:05 · 331 阅读 · 0 评论 -
Leedcode算法专题训练(动态规划)
递归和动态规划都是将原问题拆成多个子问题然后求解,他们之间最本质的区别是,动态规划保存了子问题的解,避免重复计算。斐波那契数列1. 爬楼梯70. Climbing Stairs (Easy)Leetcode/力扣题目描述:有 N 阶楼梯,每次可以上一阶或者两阶,求有多少种上楼梯的方法。题目描述:有 N 阶楼梯,每次可以上一阶或者两阶,求有多少种上楼梯的方法。定义一个数组 dp 存储上楼梯的方法数(为了方便讨论,数组下标从 1 开始),dp[i] 表示走到第 i 个楼梯的方法数..原创 2020-10-25 16:47:28 · 785 阅读 · 0 评论 -
Leedcode算法专题训练(搜索)
BFS广度优先搜索一层一层地进行遍历,每层遍历都是以上一层遍历的结果作为起点,遍历一个距离能访问到的所有节点。需要注意的是,遍历过的节点不能再次被遍历。第一层:0 -> {6,2,1,5}第二层:6 -> {4} 2 -> {} 1 -> {} 5 -> {3}第三层:4 -> {} 3 -> {}每一层遍历的节点都与根节点距离相同。设 di表示第 i 个节点与根节点的距离,推导出一个结论:对于先遍历的节点 i 与后遍历的节点.原创 2020-09-29 10:11:57 · 327 阅读 · 0 评论 -
Leedcode算法专题训练(分治法)
归并排序就是一个用分治法的经典例子,这里我用它来举例描述一下上面的步骤:1、归并排序首先把原问题拆分成2个规模更小的子问题。2、递归地求解子问题,当子问题规模足够小时,可以一下子解决它。在这个例子中就是,当数组中的元素只有1个时,自然就有序了。3、最后,把子问题的解(已排好序的子数组)合并成原问题的解。...原创 2020-09-26 16:52:05 · 240 阅读 · 0 评论 -
Leedcode算法专题训练(二分查找)
待续原创 2020-09-22 22:01:11 · 209 阅读 · 0 评论 -
Leedcode算法专题训练(贪心)
1. 分配饼干455. 分发饼干题目描述:每个孩子都有一个满足度 grid,每个饼干都有一个大小 size,只有饼干的大小大于等于一个孩子的满足度,该孩子才会获得满足。求解最多可以获得满足的孩子数量。class Solution { public int findContentChildren(int[] g, int[] s) { Arrays.sort(g); Arrays.sort(s); int i=0,j=0;原创 2020-09-10 22:23:37 · 187 阅读 · 0 评论 -
Leedcode算法专题训练(排序)
排序快速排序用于求解Kth Element问题,也就是第 K 个元素的问题。可以使用快速排序的 partition() 进行实现。需要先打乱数组,否则最坏情况下时间复杂度为 O(N2)。堆排序用于求解TopK Elements问题,也就是 K 个最小元素的问题。可以维护一个大小为 K 的最小堆,最小堆中的元素就是最小元素。最小堆需要使用大顶堆来实现,大顶堆表示堆顶元素是堆中最大元素。这是因为我们要得到 k 个最小的元素,因此当遍历到一个新的元素时,需要知道这个新元素是否比堆中最大...原创 2020-09-22 12:43:29 · 144 阅读 · 0 评论 -
Leedcode算法专题训练(双指针)
目录算法思想双指针167. 两数之和 II - 输入有序数组633. 平方数之和345. 反转字符串中的元音字母算法思想双指针167. 两数之和 II - 输入有序数组双指针的典型用法如果两个指针指向元素的和 sum == target,那么得到要求的结果; 如果 sum > target,移动较大的元素,使 sum 变小一些; 如果 sum < target,移动较小的元素,使 sum 变大一些。数组中的元素最多遍历一次,时间复杂度为 O(..原创 2020-08-19 11:25:46 · 246 阅读 · 0 评论 -
Java刷题-tree
一、分别按照二叉树先序,中序和后序打印所有的节点。这道题就是书上的算法思想的实际使用,唯一需要特别注意到的是用递归的方式建树,还是比较巧妙的,因为一棵树的建立过程字符流是重复使用的,用递归的方式对根进行循环赋值。import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamRead...原创 2020-04-30 15:41:56 · 230 阅读 · 0 评论 -
Java刷题-stack
题目描述实现一个特殊功能的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。输入描述:第一行输入一个整数N,表示对栈进行的操作总数。下面N行每行输入一个字符串S,表示操作的种类。如果S为"push",则后面还有一个整数X表示向栈里压入整数X。如果S为"pop",则表示弹出栈顶操作。如果S为"getMin",则表示询问当前栈中的最小元素是多少。输出描述:...原创 2020-03-07 15:40:48 · 219 阅读 · 0 评论 -
Java刷题-list
一、打印两个有序链表的公共部分补充一个关于节点的链表构造方法Node next是设置指针域import java.io.IOException;这个是报错信息这是两个lO流import java.io.BufferedReader;import java.io.InputStreamReader;public class Mylinkedlist { clas...原创 2020-04-02 20:31:08 · 182 阅读 · 0 评论 -
剑指offer刷题
1、面试题43. 1~n整数中1出现的次数输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。这个题目的核心思想是考虑:每个位是任意数字时,可以包含多少个这个位为1的数字分了三种情况class Solution { public int countDigitOne(int n) { //digit表示位因子,就是10、100、1000... ..原创 2020-06-11 16:36:11 · 482 阅读 · 0 评论 -
9.1树与二叉树
树根抽象为根结点,树叶概括为叶子结点。二叉树:根结点与左子树右子树分为满二叉树与完全二叉树二叉树的相关代码#include<cstdio>#include<cstdlib>struct node{ int data; //数据域数据类型为typename node *lchild; //指向左子树的根结点的指针...原创 2019-12-04 19:16:57 · 81 阅读 · 0 评论 -
7.3链表处理
目录1.malloc函数2.静态链表链表的结点一般包括两部分组成,分别是数据域和指针域;struct node{ typename data; //数据域 node* next; //指针域}1.malloc函数该函数在stdlib.h头文件下用于申请动态内存的函数,其返回类型是申请的同变量类型的指针。typename...原创 2019-10-29 21:33:18 · 117 阅读 · 0 评论 -
7.2队列的应用
一、基本定义队列是一种先进先出的数据结构,就如同食堂打饭最先来的人最先打饭出队。一般都有一个队首指针front来指向队首元素的前一个位置,而使用一个队尾指针rear来指向队尾元素。当使用数组来实现的时候,初始状态为front=-1,rear=-1,类型为int型变量。链表实现的时候同理也是首指针指向队首元素的前一个位置,队尾指针rear来指向队尾元素,类型为int* 型变量。二...原创 2019-10-07 18:59:35 · 158 阅读 · 0 评论 -
7.1栈的应用
栈就是一种后进先出的数据结构。一般都有一个栈顶指针,指向栈的最上面的一个元素,当用数组实现堆栈的时候,栈顶指针就是一个int型的变量,当没有元素的时候记为-1,第一个元素为0,用TOP来表示。当用链表来实现栈的时候,则是一个int*型的指针数组的实现typedef int Position;struct SNode { ElementType *Data; /* 存储元...原创 2019-10-06 23:12:11 · 110 阅读 · 0 评论 -
6.4map用法
map是映射也是常用的STL容器,可以将任何基本类型映射到任何的基本类型,如 map<char,int>mp一、基本定义map<typename,typename>mp;map<string,int>mp;map<char,int>mp当建立好映射之后,就可以使用mp['c']=20,这样和普通数组一样的方式,注意map的键是唯一的...原创 2019-10-06 22:16:33 · 124 阅读 · 0 评论 -
6.3string用法
string类型可以大大方便对字符串的处理1.string的定义string str;string str="abcd";2.string中内容的访问(1)可以像字符数组一样进行访问printf("%c",str[i]);(2)如果想读入和输出整个字符串,则只能用cin和cout#include<cstdio>#include<string&...原创 2019-09-27 17:15:16 · 119 阅读 · 0 评论 -
6.2set用法
目录1.set的定义2.set容器内元素的访问3.set常见使用的函数set可以内部进行自动递增排序,且自动去除了重复元素1.set的定义set<typename> name;set<typename> a[100];2.set容器内元素的访问set<typename>::iterator it;可以得到迭代器it...原创 2019-09-27 16:21:40 · 281 阅读 · 0 评论 -
6.1vector用法
目录一、用法介绍二、基本用法三、PAT A1039一、用法介绍vector<typename>name;按照这样的格式进行定义与书写。注意定义成双数组的情况要加上空格。vector<int> vi[100];vector的用法和数组是一样的,可以直接用下标进行访问。也可以用迭代器进行访问it相当于指针vector<ty...原创 2019-09-16 21:25:54 · 136 阅读 · 0 评论 -
4.3递归&4.4贪心
目录4.3递归4.4贪心PAT A1070Mooncake(25分)PAT A1033To Fill or Not to Fill(25分)PAT A1033To Fill or Not to Fill(25分)PAT A1067Sort with Swap(0, i)(25分)PAT A1038Recover the Smallest Num...原创 2019-08-01 21:32:20 · 143 阅读 · 0 评论 -
4.2散列
目录4.2散列PAT A1084Broken Keyboard(20分)PAT A1092To Buy or Not to Buy(20分)PAT B1042字符统计(20分)PAT B1043输出PATest(20分)PAT B1047编程团体赛(20分)PAT A1041Be Unique(20分)PAT A1050Stri...原创 2019-05-29 19:15:57 · 221 阅读 · 0 评论 -
4.1排序
今天开始继续算法笔记的学习,也算是复习一下之前学的内容。主要回顾了一下算法笔记的排序方面的内容,再总结一下排序的一些常用的方法。4.1排序4.1.1选择排序一种非常基础的排序方式,就是重复将一个序列A中的最小值取出来,放入到另一个序列B中。4.1.2插入排序将序列A中的数一个个放入序列B中,放入的过程中进行排序。这两种方法可以这样理解,一个是排好序再放入,一个是先放入...原创 2019-05-22 19:42:56 · 236 阅读 · 0 评论