![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法练习
chicken3wings
我要成为神仙程序员儿
展开
-
算法网课笔记(七)——排序
三类常见排序问题:插入排序和冒泡排序都是O(n²),为什么插入排序更收欢迎?如何分析一个排序算法1.最好,最坏。平均时间复杂度2.时间复杂度的系数,常数,低阶3.比较次数和交换次数4.算法的内存消耗原地排序指的是空间复杂度是O(1)的排序算法5.算法的稳定性即,如果序列中存在相同的值,经过排序后,相等元素的原有先后顺序不变稳定性在实际应用中很重要冒泡排序(Bubble Sort)def bubbleSort(nums): flag=0 n=len(nums)原创 2020-07-15 15:19:41 · 499 阅读 · 0 评论 -
算法网课笔记(六)——递归
给定一个用户ID,如何查找其“最终推荐人”递归典型递推公式:f(n)=f(n-1)+1,f(1)=1递归代码int f(int n){ if (n==1) return 1; return f(n-1)+1; }递归的三个条件1.一个问题的解可以分解为几个子问题2.子问题与原问题,除了数据规模,求解思路完全一样3.存在递归终止条件如何写递归代码关键:(1)递推公式,(2)终止条件以走楼梯为例,n阶楼梯,可以一步一阶或者一步2阶,有多少种走法?递推公式:f(n)=f(n-1)原创 2020-07-11 16:38:38 · 413 阅读 · 0 评论 -
算法网课笔记(五)——队列
队列queue先进先出,入队enqueue,出队dequeue队列也是一种操作受限的线性表数据结构具有额外特性的队列:循环队列、阻塞队列、并发队列、、原创 2020-07-11 11:52:19 · 243 阅读 · 0 评论 -
算法网课笔记(四)——栈
栈先进后出,后进先出,栈是一种操作受限的线性表,只允许在一段插入和删除如何实现一个栈顺序栈:用数组实现的栈链式栈:用链表实现的栈# 创建一个栈的class# 定义入栈和出栈操作空间复杂度:入栈和出栈都是O(1)时间复杂度:即使是支持动态扩容的栈,按照均摊时间复杂度算,也是O(1)函数调用栈操作系统会给每个线程分配一块独立的内存空间,这块内存被组织成栈结构,用来存储函数调用时的临时变量。每进入一个函数,先将其需要的临时变量作为一个栈帧入栈,当函数执行完成,返回值后,将该函数对应的栈帧出原创 2020-07-05 00:40:23 · 263 阅读 · 0 评论 -
算法网课笔记(三)——链表
常用缓存策略FIFO、LFU、LRU如何用链表实现LRU?链表相关知识结点、后继指针(next)、头结点、尾结点、前驱结点循环链表、双向链表(next、pre)PS:在“删除某个指针指定的节点”或者“在某个指定节点前插入”这种操作中,双向链表复杂度是O(1),而单链表是O(n); 在“删除特定值的节点”的操作中,二者复杂度都是O(n)链表在插入删除上,比数组优秀;而在随机访问上,数组为O(1),链表为O(n)链表的内存相比数组会翻倍此外,数组的连续内存机制,可以利用CPU的缓存机制,预读原创 2020-06-27 14:56:18 · 165 阅读 · 0 评论 -
算法网课笔记(二)——数组
为什么数组标号都从0开始数组(Array)是一种线性表数据结构,用一组连续的内存空间,存储一组具有相同类型的数据。因为“下标”的本质是“偏移(offset)”,即a[0]是偏移=0的地址,即首地址;a[k]是偏移=k的地址,地址计算公式如下a[k]_address = base_address + k * type_size如果下标从1开始,则计算公式需要变成a[k]_address = base_address + (k-1)*type_sizeCPU每次都需要多做一次减法指令,为了效率优化,原创 2020-06-26 14:20:41 · 193 阅读 · 0 评论 -
算法网课笔记(一)——复杂度分析
课程来源极客时间——数据结构与算法之美(王争)概述数据结构:一组数据的存储结构算法:操作数据的一组方法数据结构为算法的服务,算法要作用在特定的数据结构上复杂度分析:算法时间和资源效率的考量,很重要课程内容总览:10个数据结构:数组,链表,栈、队列、散列表、二叉树、堆、跳表、图、Trie数10个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法复杂度分析事后统计法的缺点:1.测试结果依赖测试环境;2.测试结果受数据规模影响大复杂度计算过程原创 2020-06-26 10:48:53 · 575 阅读 · 0 评论 -
20200620
#include <bits/stdc++.h>using namespace std;bool sort_cmp(const pair<int, int> &A, const pair<int, int> &B) //涉及到,条件运算符,sort结构体排序{ //如果AB的x值(喜好程度)相同,则将i值(用户编号)升序排序 //如果x值不同,则根据x值进行升序排序 return A.first == B.first ? A.sec原创 2020-06-20 17:10:22 · 223 阅读 · 0 评论 -
算法题(模板)——N个球放入M个盒子中
题目:n个球放入m个盒子中,有多少种放法情况一:球同,盒不同,无空盒也就是所有球都是一样的,但是盒子有区别,且不能出现空放的情况。采用插板法,相当于在n-1个空隙中,插入m个盒子,而由于不能有空盒子,所以n个球的最前边或者最后边一定会放一个盒子,所以相当于n-1和间隙中放入m-1个盒子。C(n-1,m-1), n>=m0, n<m情况二:球同,盒不同,允许有空盒先假设m个盒子中都放好了1个球,即假设共有m+n个球,然后情况变为第一种情况,即n+m个球放入m个盒子中,没有空盒。C(原创 2020-05-13 13:43:51 · 13905 阅读 · 0 评论 -
阿里笔试题20200506
题目一:m种球中购买总计n个球的策略数你现在需要购买n个乒乓球,超市中提供了m种不同的球,由于对第一种特别喜爱,因此至少买一个。求不同的购买方案对10^9+7取模的结果。如果2种购买方案在某种球数量上不同,则认为属于不同方案输入描述:一行两个数字n, m1<=n,m<=1000输入:2 2输出:2说明:2种方案位(1,1)和(1,2)题解一考虑动态规划# d...原创 2020-05-07 00:15:45 · 868 阅读 · 0 评论 -
DFS和BFS,以及多源BFS
深度优先遍历DFS使用回溯法以及栈结构实现,用于寻找全部解中的最优解等任务。搜索时需要将走过的位置标记出来,当回溯时,可能需要取消一部分节点标记。广度优先遍历BFS使用队列结构实现,常用来求最短路径,最近距离点等任务。已经探索过的节点需要进行标记,且标记之后不会取消,即不会被重复探索。DFS与BFS的对比DFS浪费时间,节省空间BFS节省时间,浪费空间多源BFS来自于一道lee...原创 2020-04-02 20:51:36 · 905 阅读 · 6 评论 -
Leetcode每日一题——圆圈中最后剩下的数字
题目0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。题解(1)假设有n个数,下标0~n-1,则把第m个数进行删除,此时删除的数的下标是[m-1]%n。(2)删除之后剩下n-1个...原创 2020-03-30 16:48:23 · 234 阅读 · 0 评论 -
几个排序算法(未完)
快速排序(基准,哨兵ij,交换)空间复杂度:O(log2(n))时间复杂度:最好的情况是O(n),最差的情况是O(n2),所以平时说的O(nlogn),为其平均时间复杂度。基本思想:随机取一个数(最左或最右)作为基准,比基准小的放左边,比基准大的放右边,方法是和基准进行交换,然后再从左右2部分重新选择基准,直至不能分解位置。例子:对于序列(6,1,2,7,9,3,4,5,10,8),以6...原创 2020-03-20 12:55:05 · 150 阅读 · 1 评论 -
leetcode005(暴力解法+动态规划法)
//最慢:找到每个字符为起始的所有回文串,并保存最长的(算法上难以实现?假设取第一个字符,那么必须判断到1/2长度之后,才能确定有无回文串)//效率太低//能否考虑按照特定字符作为起始,来找回文串//假设第一个字符为a,从字符串末尾找另一个a,并判断夹在中间的是不是回文串;//若不是,继续向前找下一个a,再次判断;//若是,则该回文串是以a作为首位的最长串//////如何判断一个...原创 2019-08-27 22:44:06 · 229 阅读 · 0 评论 -
宝石与石头——leetcode771
leetcode771——字符串比较问题,宝石与石头#include<iostream>#include<string>#include<istream>using namespace std;int main(){ string J;//代表石头中宝石的类型 string S;//代表拥有的石头,其中每个char代表了一种拥有的石头类型 //...原创 2019-05-21 00:05:17 · 149 阅读 · 0 评论 -
按递增顺序显示卡牌——Leetcode950
leetcode950——按增序显示卡牌(循环队列,标志位的使用,向量vector的基本操作)//思路://翻开-置底的操作,相当于对新数组间隔取值//在第一轮翻到底之后,被置底的牌依旧是按照下标递增的顺序排列的//重复执行前2步,直到没有牌//本质://将数组变为”循环队列“,并且间隔取值,取过的位置被移除,且要求取值是升序的//代码://(1)如何将数组变成循环队列, 使用...原创 2019-05-24 23:18:16 · 237 阅读 · 0 评论 -
两数相加——leetcode002
leetcode002——两数相加(链表,python)# -*- coding: utf-8 -*-"""Created on Wed May 22 09:25:47 2019@author: Lenovo"""# Definition for singly-linked list.class ListNode(object): #定义链表类 def __init__...转载 2019-05-22 10:18:07 · 90 阅读 · 0 评论 -
唯一摩斯密码词——Leetcode804
Leetcode804——摩斯密码重复单词计数(字符串的比较,数组元素的替换)注:耗时明显长于平均水平,之后可以研究一下。//创建摩斯密码表,逐个翻译单词,再统计翻译后有多少不同种类字符串class Solution {public: int uniqueMorseRepresentations(vector<string>& words) { ...原创 2019-05-27 00:38:28 · 313 阅读 · 0 评论 -
合并两个有序链表——leetcode021
合并两个有序链表(链表基本操作,java)思路创建链表头节点,以及用于插入节点的位置指针(java中没有指针,用类的成员代替)顺序遍历并比较两个链表,找到进入新链表的节点(的值)创建新节点,赋值,插入到新链表中代码/** * Definition for singly-linked list. * public class ListNode { * int val; *...原创 2019-05-22 22:42:46 · 110 阅读 · 0 评论 -
保持城市天际线——leetcode807
LeetCode——保持城市天际线(二维数组遍历)//leetcode807——保持城市天际线(即增加数组中的值,增加后4个行最大值和4个列最大值保持不变即可,求最大增加数量)//思路://当增加某一元素的值时,先判断它是否是行或者列的最大值,如果是,跳过//如果不是,找到它所在行列的最大值,令该元素值=min{行最大值,列最大值},//代码://遍历数组,找打行列最大值,保存在新的数...原创 2019-05-23 13:27:26 · 153 阅读 · 0 评论 -
螺旋矩阵2——Leetcode059
螺旋矩阵2(伪递归,二维数组赋值)//数组的遍历问题,螺旋遍历//考虑递归的话:每次递归需要执行的操作是//(1)给定矩阵大小n,左上角位置pos=(0,0),要赋值的初始值i=1//(2)对该矩阵四条边顺时针赋值,四个for循环,//(3)然后令n=n-2,pos=(1,1),i=4n-4+1,重复步骤(1)//(4)终止条件所有的值被用完,即在进行n*n的赋值操作之后结束//在类...原创 2019-05-28 00:19:46 · 229 阅读 · 0 评论 -
Leetcode15——三数之和(问题降维,对撞指针,剪枝)
对撞指针两个指针,分别指向数组(一般是排序后的数组)的头尾,根据不同的条件依次向中间靠拢可以用来解决:找数组中满足一定条件了两个数(不重复)的问题class Solution {public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vecto...转载 2019-06-12 22:24:30 · 137 阅读 · 0 评论 -
Leetcode338——比特位计数
对于二进制数x,2x相当右移补0,2x相当于右移补1class Solution {public: vector<int> countBits(int num) { vector<int> vec(num+1); //创建vector数组时,初始值默认=0 int i; for(int i=0;i<...转载 2019-06-10 11:47:27 · 101 阅读 · 0 评论 -
最多能完成排序的块 II——Leetcode768
768. 最多能完成排序的块 II初始版本(耗时很长)//arr[int],有重复元素//将数组分块,每块排序,再组合//组合后的结果,和按照升序排序后的原数组相同//有示例2可以看出,某一位置可以分块的前提是,从该位置分出去的块,该块内包含的元素,与arr数组整体排序之后,对应位置的元素相同也就是[2,1]对应了[1,2],所以可以分成一块//整体思路://先对arr进行升序排...原创 2019-06-04 22:18:37 · 367 阅读 · 0 评论 -
删除最外层的括号——leetcode1021
leetcode1021——字符串原语分解,并删除最外层括号//题目:不可再的字符串称为原语,要求将给定字符串做原语分解,并且去掉最外层括号//详见leetcode 1021/*思路: 由三个示例可明确求解步骤,首先,分类最外层括号(即不是包含在括号内的括号) 然后删除每个子字符串外层括号 可以使用堆栈;左括号入栈,右括号出栈;堆栈最底层元素进栈和出栈的时机,就是最外层括号出现的...原创 2019-05-21 00:02:50 · 222 阅读 · 0 评论