算法以及数据结构
天下第一小白
作者目前就职于某大厂,研究方向是深度学习领域,微服务等。对算法和数据结构比较感兴趣,经常会分享一些leetcode题解和面试知识,希望我的博客能够帮您解决问题,提升自己,今天很高兴认识你。
展开
-
关于字节面试过程不会的算法题总结
这个题目拿到手,我想到的就是把它转为String,然后对string用默认的字典序排序算法,显然忽视了当n取极限值10^9时带来的内存问题。一开始的解法:class Solution { public int findKthNumber(int n, int k) { ArrayList<String> list = new ArrayList<>(); for(int i = 1; i<=n; i++){ .原创 2021-10-09 10:59:03 · 397 阅读 · 1 评论 -
关于树的几道面试题目
class Solution { int ret = 0; public int diameterOfBinaryTree(TreeNode root) { deepth(root); return ret; } public int deepth(TreeNode root){ if(root == null) return 0; int left_max = deepth(root.left); .原创 2021-09-21 18:45:14 · 142 阅读 · 0 评论 -
二分的思想在算法中体现
在引入思想之前,先做几个题目:875. 爱吃香蕉的珂珂class Solution { public int minEatingSpeed(int[] piles, int h) { int len = piles.length; if(len == 0) return 0; long left = 1; long right = (long)Math.pow(10,9); while(left < righ原创 2021-05-07 10:55:40 · 85 阅读 · 0 评论 -
针对中位数求解的几道题
首选用堆,一般用两个堆来求解中位数。class MedianFinder { int count; PriorityQueue<Integer> max; PriorityQueue<Integer> min; /** initialize your data structure here. */ public MedianFinder() { count = 0; max = new Priori原创 2021-01-03 11:28:09 · 232 阅读 · 0 评论 -
分治法解决逆序对问题
直接暴力,O(N2)O(N^2)O(N2)时间复杂度,必然是超时的,hard 怎么可能让你这么轻松AC ????,楼主还是愿意试试:试了两种方法超时了,还是太笨了,于是不争气的看了题解????,之前没做过这种题型,可以理解,下次碰到这种可不能错了,这是基于分治法的一种应用,如果熟悉归并排序的,应该是没问题,不熟悉的话,可以跳到这里 归并排序,我们在合并的过程中进行计算,这里官方给了一个视频讲解,(顺便膜拜一下weiwei大佬????):原创 2020-12-01 17:05:14 · 895 阅读 · 1 评论 -
线段树 && 树状数组
基于数组写的线段树,建议配合使用 307. 区域和检索 - 数组可修改import java.util.Arrays;public class SegmentTree { int n; int[] tree; public SegmentTree(int[] nums){ n = nums.length; tree = new int[4*n]; } public void buildTree(int[] nums){原创 2020-11-29 23:04:19 · 130 阅读 · 0 评论 -
Interval(区间类问题)
这类问题其实是有一些固定的解题思路,可以节省很多时间,下面以一个简单的例子作为入门(传送门):先给出代码,最后我们再进行解释:class Solution { public int[][] merge(int[][] intervals) { // step 1: sort int len = intervals.length; if(len < 2) return intervals; Arrays.sort(interv原创 2020-11-23 23:10:14 · 1376 阅读 · 0 评论 -
LRU的两种实现方案
看到这个问题,可能拿到手就想用LinkedHashMap来几分钟就给实现了,确实也可以,但是现在很多面试要求你不用LinkedHashMap能不能实现这个问题,基于面试的这种要求,我开了这篇博客:(常规解法)基于 LinkedHashMap 实现:class LRUCache { Map<Integer,Integer> map; private int capacity; private int size = 0; public LRUCache(int原创 2020-11-18 17:51:22 · 383 阅读 · 0 评论 -
队列的算法相关专题
同样,这里也以一道题目为切入点这题看似和队列没啥关系,但是涉及到图的广度优先遍历,我们可以构造出一个关系图:拿6举例子,和2之间相差4,和5相差1,都是平方数,此图就是由相隔平方数构成。class Solution { public int numSquares(int n) { Queue<Pair> queue = new LinkedList<>(); queue.offer(new Pair(n,0)); if(n原创 2020-09-04 20:19:45 · 330 阅读 · 0 评论 -
算法面试中单链表专题
链表是算法面试中一个比较常考的内容,下面以面试中常见的算法题作为切入点:首先来道开胃菜:92. 反转链表解题思路: 这道题反转,我们可以考虑以头插法的方式来解决,这样一个好处是,我们对中间的链表进行反转之后,重新插入只需要考虑尾部,头部不用考虑了,举例来说:上面的 2->3->4,通过尾插法之后,1->4最后连接不用管了,而只需要关心2->5的连接。代码如下:class Solution { public ListNode reverseBetween(Li原创 2020-09-01 16:32:05 · 146 阅读 · 0 评论 -
插入排序算法(C实现)
总体思路是:先记录每一次要插入的值,插入的值依次与前面插入的值比较大小,直到找到那个值,然后后面的值全部后移空出的位置,就是他的正确位置。循环n次实现排序。#include<stdio.h>void insertvalue(int a[],int n);void main(){ int a[5]= {5,9,47,3,4}; printf("排序之前:\n"); for原创 2017-07-22 09:23:44 · 294 阅读 · 0 评论 -
分治法求最大子串
最近在学分治法,涉及到很多问题都能用分治法解决,汉诺塔,快排,归并排序等,下面是解决最大字串问题。1,用分治法解决,下面还介绍不用分治解决的另一种方法。原创 2017-07-24 14:40:51 · 716 阅读 · 0 评论 -
55. Jump Game --leetcode
problem description Given an array of non-negative integers, you are initially positioned at the first index of the array. Each element in the array represents your maximum jump length at that p原创 2017-12-20 15:07:02 · 184 阅读 · 0 评论 -
树的几种遍历方式(递归/非递归)
树的几种遍历方式,前序遍历,中序遍历,后序遍历,包括它的递归实现以及非递归实现#include<stdio.h>#include<stdlib.h>typedef struct tree{ int data; struct tree *left; struct tree *right; int flag ;}*pnode,node;pnode createbina原创 2017-07-28 22:06:13 · 2056 阅读 · 0 评论 -
平衡二叉树&搜索二叉树
设n(h)表示为高度为h的平衡二叉树的最小节点数,则 n(h) = n(h-1) + n(h-2) + 1,也就是高度为h-1的平衡树最少节点数+高度为h-2的最小节点数+1 。 这点类似于fibolacci数列 ,n(h) = F(n+2) - 1下面是如何建立搜索二叉树:...原创 2018-06-22 10:46:32 · 436 阅读 · 0 评论 -
链表的高级特性
1,循环单链表创建的原理和单链表,差不多,唯一不同的是最后返回尾节点,且尾节点指向头结点。#include <iostream>#include <stdlib.h>using namespace std;typedef struct Node{ int data; struct Node *next;} node, *pnode;pnode CreateCircle(i原创 2017-10-09 19:46:37 · 260 阅读 · 0 评论 -
大整数乘法--leetcode Multiply Strings
大整数乘法本文转载自http://www.cnblogs.com/TenosDoIt/p/3735309.html 我们在日常的大整数计算中,通常是把它转化为字符型计算。这道题的思路就和我们小学计算乘法一样, 想乘的的结果,错位相加,最终进位,得到我们 的结果。题干如下:Given two non-negative integers num1 and num2 represented as st转载 2017-12-26 10:13:36 · 958 阅读 · 0 评论 -
超级素数
**题目是m位超级素数本身是素数,去掉一位后m-1位素数,去掉两位m-2位素数等等,例如137,去掉1后,37是2位素数,接着去掉3后是一位素数,所以是超级素数。而103不是,去掉1后,剩下3,不可能是2位素数。**int superSu(int m){ int last; //最后一个素数 int x = pow(10,m-1); //计算区间 int ...原创 2018-07-28 19:23:04 · 948 阅读 · 0 评论 -
Dijkstra Algorithm (迪杰斯特拉算法)
这里需要详细说明参数,v表示第一个顶点,dist[i]表示从v到各个顶点vi的最短路径长度,path[]保存的是最短路径上一个顶点的位置,它其实就像一棵树,保存的是双亲节点的,遍历的时候可以按照双亲节点的遍历思想。具体思想请参见课本。先看一下遍历path:void PrintPath(int path[],int v) //v为顶点v,也就是打印根节点(也就是第一个节点)到顶点V的路...原创 2018-07-29 08:20:06 · 343 阅读 · 0 评论 -
二叉排序树的删除
要删除排序树的某个节点,主要讨论删除节点有左右子树的情况:可以用右子树的最小元素或者左子树的最大元素来替代被删除的节点具体实现算法:(递归删除)...原创 2018-06-22 09:20:39 · 1364 阅读 · 0 评论 -
吉林大学计算机高级程序设计笔记
3.26日复试完,我写这篇的目的,给我这一年做一个总结,也把我这一年所有的笔记记录在博客中,有意考吉大的同学可以做一个参考。原创 2019-03-29 09:36:05 · 2483 阅读 · 3 评论 -
966,967吉大数据结构笔记
3.26日复试完,我写这篇的目的,给我这一年做一个总结,也把我这一年所有的笔记记录在博客中,有意考吉大的同学可以做一个参考。原创 2019-03-30 17:58:13 · 3584 阅读 · 1 评论 -
简单选择排序(C)
从无序序列中选出最小的值放入有序序列中,这就是简单排序的思想原创 2017-07-22 16:32:14 · 245 阅读 · 0 评论 -
C 关于链表的一些操作
今年暑假正式开始我的数据结构学习之旅,虽然之前学过一遍了,但是感觉完全是应付考试,没有认真学所以,今年打算从头到尾正式学习一遍,每天持续更新学习成果。今天重温了一下链表的增删改查,分享一下。原创 2017-07-16 19:40:44 · 269 阅读 · 2 评论 -
CCF201612-1 中间数
问题描述 在一个整数序列a1, a2, …, an中,如果存在某个数,大于它的整数数量等于小于它的整数数量,则称其为中间数。在一个序列中,可能存在多个下标不相同的中间数,这些中间数的值是相同的。 给定一个整数序列,请找出这个整数序列的中间数的值。 输入格式 输入的第一行包含了一个整数n,表示整数序列中数的个数。 第二行包含n个正整数,依次表示a1, a2原创 2017-09-28 19:56:40 · 726 阅读 · 0 评论 -
堆排序/手写堆
堆排序: 1,开始建堆,已一个小根堆为例:(图片摘自别人,与下面的排序代码无关)构造好了堆之后,下面就是排序的过程:直接上代码了:#include<iostream>using namespace std;void sift(int a[],int m,int n);void sorts(int a[],int n);void swaps(int *sa,int *b);int main原创 2017-08-06 15:24:17 · 340 阅读 · 0 评论 -
DFS走迷宫问题(非最短路径)
上面之所以要强调非最短路径,是因为在下一篇我要用BFS来求解最短路径的问题。这里只是讲如何走出迷宫。#include<cstdio>#define M 10#define N 10using namespace std;void mi(int x,int y);int a[N][M] = {//从(0,1)到最下面的2位置,1围墙,0路径 1,1,1,1,1,1,1,1,0,1,原创 2017-08-01 20:41:26 · 1072 阅读 · 0 评论 -
部分和问题
问题描述:给定整数a1~an,判断是否可以选出若干数,使它们的和恰好为K。eg1: input: n=4 a = {1,2,4,7} k=13 output: Yes (13 = 2+4+7)eg2: input: n=4 a = {1,2,4,7} k=15 output: No#include<cstdio>using namespace std;bool rec原创 2017-08-01 15:38:52 · 198 阅读 · 0 评论 -
汉诺塔问题
汉诺塔递归问题详解:a是初始塔,b为中间塔,c为目标塔原创 2017-07-23 18:22:33 · 328 阅读 · 0 评论 -
折半查找(非递归与递归实现)
折半查找非递归与递归实现:原创 2017-07-23 10:01:02 · 2780 阅读 · 2 评论 -
希尔排序(分而治之)
希尔排序其实就是一种改进版的插入排序,当d=1时,其实就是插排了,先把数组分为n/2组,再把这n/2组,分别排序,排好之后,再分为n/4组,一直到n/n组。其实最后也就是插排了。原创 2017-07-22 11:01:11 · 346 阅读 · 0 评论 -
关于队列(数组队列,链表队列,循环队列)
下面是关于队列的一些基本操作:原创 2017-07-18 19:29:20 · 262 阅读 · 0 评论 -
哈夫曼算法(huffman algorithm C)
哈夫曼算法:它主要用于找出最小生成树,即树的权值*路径相加最小。#include<stdio.h>#define size 10typedef struct huffman{ int weight; int lchild,rchild,parent;} huff;void select(huff a[],int b[],int qu);void huffman(huff hu原创 2017-07-30 18:07:40 · 1110 阅读 · 0 评论 -
栈的基本操作(数组/链表)
下面是分别用数组和链表演示栈的一些操作原创 2017-07-18 12:17:34 · 320 阅读 · 0 评论 -
单链表实现反转的三种方法
单链表的操作是面试中经常会遇到的问题,今天总结一下反转的几种方案:1 ,两两对换 2, 放入数组,倒置数组 3, 递归实现原创 2017-07-17 20:03:31 · 9876 阅读 · 0 评论 -
归并排序(分治法)
归并排序,涉及到两个函数,一个函数merger()负责把两个有序的子序列合并成一个有序的子序列,另外一个函数tomany()是负责把子序列排序,是采用分治的思想排序。首先把子序列分成一个,都是有序的,两个通过递归调用merger(),也能使他有序,因为一个是有序的,merger()能使两个有序的,大小为1的子序列合并成一个大小为2的子序列,由此可见扩展成4,8,16个都能使之有序。代码如下:原创 2017-07-24 18:24:29 · 949 阅读 · 0 评论 -
贪心算法之硬币问题
要求:给定面额为1,5,10,50,100,500这六种面额的硬币,各3,2,1,3,0,2枚,现在用这些硬币支付A元,求使用最少的硬币。先上代码:#include<cstdio>using namespace std;int solve(int A);const int v[6] = {1,5,10,50,100,500};//面额int main(){ solve(620);原创 2017-08-02 20:06:00 · 5211 阅读 · 0 评论 -
3Sum问题
Problem: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero. For example, given array S =原创 2017-08-16 14:44:25 · 419 阅读 · 0 评论 -
leetcode__Longest Substring Without Repeating Characters
The Question is: Given a string, find the length of the longest substring without repeating characters. Examples: Given “abcabcbb”, the answer is “abc”, which the length is 3. Given “b原创 2017-08-14 19:09:24 · 220 阅读 · 0 评论 -
STL_stack/queue
队列和栈在STL中的运用:stack:(先进后出)#include<stack>stack<int>s;s.push(1);s.push(3);s.top();//返回3,栈顶元素s.pop();//出栈,并返回出栈元素3s.size();//返回栈长度s.empty();//空的返回truequeue:(先进先出)#include<queue>queue<int>q;q.push原创 2017-08-14 12:13:44 · 153 阅读 · 0 评论