算法题
Owl丶
这个作者很懒,什么都没留下…
展开
-
马踏棋盘 回溯/贪心
转自公众号:树屋编程直接用递归回溯很慢,可以通过加入贪心来加快计算速度:用贪心算法的思想来解决在棋盘如何选择下一个节点的问题,就是计算马儿的哪个下一节点对应的下一个节点(即下下个节点)的总数最少,就将哪个下一节点视为最优。(尽量选择出口最少的点,就能在最短时间内到达较深处,就能让计算速度尽量快)#include <bits/stdc++.h>using namespace std;// 每个点最多可以朝8个方向跳const int DIRECTIONS = 8;struct转载 2021-01-30 23:42:04 · 138 阅读 · 0 评论 -
有环无向图删除冗余边形成生成树 类问题
题目类型:N个点M条边的无向图,删除边使无向图连通无环(生成树)。【思路】并查集合并函数返回是否连通的bool类型,然后遍历每条边,合并边的两端点。例题一class Solution {public: int fa[1005]; void init(int n) { for (int i = 1; i <= n; i++) fa[i] = i; } int get(int x) { if(fa[x] =原创 2020-09-06 13:22:03 · 1214 阅读 · 0 评论 -
求组合数 :DP、逆元+快速幂
要求:求 Cmn%pC_{m}^n \% pCmn%p ,p为素数(经典p=1e9+7)方法一:DPC[n][m]=CnmC_{n}^mCnm公式Cnm=Cn−1m−1+Cn−1mC_{n}^m=C_{n-1}^ {m-1}+C_{n-1}^{m}Cnm=Cn−1m−1+Cn−1m证明:班级中有n个人,选出m个人开除,有两种选法:班长不开除,从剩下的人中开除m个人开除班长,从剩下的人中开除m-1个人const int MOD = 1e9 + 7;int C[1005][1005原创 2020-08-30 16:02:28 · 278 阅读 · 1 评论 -
线段合并问题
使用length数组维护下标i元素所在的满足要求的区间(连续为1的区间)的长度,只需维护所有1区间两端端点即可。当步骤i的1出现时,下标为x=arr[i],找到该索引x的左右两个下标x-1,x+1的length数组值(即所在1区间的长度),合并区间,通过原区间长度找到x-1所在区间的左端点和x+1所在区间的右端点,维护新长度。因为可能遇到边界,所以默认在ivec两端各加一个哨兵0。使用哈希表记录长度为len的1区间的数量。class Solution { public: int f.原创 2020-08-23 13:15:44 · 1649 阅读 · 0 评论 -
逆序对系列问题:求满足 i < j,且nums[j] -nums[i] < k 的( i , j )数量
LEETCODE中有一系列问题,思路都同逆序对:315.逆序对给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。493.翻转对给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。你需要返回给定数组中的重要翻转对的数量。327.区间和的个数给定一个整数数组 nums原创 2020-08-11 16:17:01 · 1447 阅读 · 0 评论 -
链表排序:快速排序、归并排序
快速排序非交换节点值【思路】链表快排与普通快排的不同首先在于链表无法直接swap,因此使用leetcode86题的双指针方法实现partition。其次,因为排序后首尾节点会变化,所以需要记录新的首节点。struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(nullptr) {} ListNode(int x,ListNode* p) : val(x), next(p) {原创 2020-08-06 21:21:12 · 198 阅读 · 0 评论 -
状态压缩动态规划(状压DP) 及 枚举子集优化
一个整数可以转化成二进制数,它可以代表某个集合的一个状态,这两者一一对应。使用场景如果一个题目适合用dp求解,但是状态特别多,可以把状态压缩为二进制数,使用状态压缩DP。整数的二进制表示状态,通过位运算进行状态转换。旅行商问题:有一个商人想要旅行各地并进行贸易。各地之间有若干条单向的通道相连,商人从一个地方出发,想要用最短的路程把所有地区环游一遍,请问环游需要的最短路程是多少?在这题当中,我们假设商人从0位置出发,最后依然回到位置0。#include<bits/stdc++.h>u原创 2020-07-29 14:37:03 · 1269 阅读 · 0 评论 -
已知 sqrt (2)约等于 1.414,要求不用数学库,求 sqrt (2)精确到小数点后 10 位。二分法、模拟退火算法
问题:已知 sqrt (2)约等于 1.414,要求不用数学库,求 sqrt (2)精确到小数点后 10 位。【方法一】二分查找double sqrt2( ){ double low = 1.4, high = 1.5; const double eps = 1e-11; while (high - low > eps){ double mid = (low + high) / 2; if (mid*mid > 2){ hi原创 2020-07-28 09:46:35 · 643 阅读 · 0 评论 -
原地哈希
使用场景要求空间复杂度O(1),且数组元素和数组下标(0 ~ n-1或 1 ~ n)有关,却需要使用哈希表的题目,可以使用原地哈希,将数组当成哈希表。遍历数组时交换元素,使得 nums[i]=i(或nums[i]=i+1)。比如:nums[0]=0(或1),nums[1]=1(或2),nums[2]=2(或3)……例题:【思路】原地哈希,当nums[i]超出范围或者重复时,放弃交换,遍历下一个元素。class Solution {public: int firstMissingPosi原创 2020-07-23 09:25:32 · 656 阅读 · 0 评论 -
LRU和LFU算法 C++实现
LRU【思路】哈希表+双向链表list使用节点为pair<int,int>的双向链表list,同时用存储对应节点迭代器的哈希表来实现O(1)查询。(用pair<int,int>来代替有key,value两成员的节点Node)因为从哈希表中删除尾结点时,需要知道尾结点对应的key,所以链表节点必须储存key。class LRUCache {private: int capacity; list<pair<int,int>> mylist原创 2020-07-16 16:44:40 · 687 阅读 · 0 评论 -
树状数组
使用场景log(n)时间复杂度求动态数组(元素可变)区间和,准确的来说是前缀和,但区间和可以由两个前缀和相减来得到。log(n)时间复杂度对数组单个元素进行修改。定义原数组为a[1…n],定义数组t[1…n],t[k]表示从t[k]开始往左连续求 lowbit(k) 个数的和。lowbit(k)就是把k的二进制的高位1全部清空,只留下最低位的1,比如10的二进制是1010,则lowbit(k)=lowbit(1010)=0010(2进制),比较普遍实现的方法lowbit(k)=k&-k.原创 2020-07-05 15:59:54 · 121 阅读 · 0 评论 -
c++二叉树调试:二叉树生成、格式化输出
遍历顺序:层次遍历#include<bits/stdc++.h>using namespace std;struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {}};class tree{//创建二叉树public: TreeNode* root; tree(vector原创 2020-07-02 22:32:44 · 889 阅读 · 0 评论 -
二分查找/二分答案:最长上升子序列(LIS)、最大的最小值、最小的最大值
【总结】使用while(left<right)分析起来更清晰,且不会越界。但是,用left=mid收缩边界时(比如求右边界),mid必须向上取整:mid=(left+right+1)/2,否则在元素只有两个时进入死循环。【举例】nums={1,1} ,求1的右边界时,mid=(0+1)/2=0,while(left<right){ int mid=le...原创 2020-05-04 10:41:04 · 491 阅读 · 0 评论 -
二叉树最近公共祖先(LCA)
方法一:直接递归1) 如果当前结点 root 等于NULL,则直接返回NULL2) 如果 root 等于 p 或者 q ,那这棵树一定返回 p 或者 q3) 然后递归左右子树,因为是递归,使用函数后可认为左右子树已经算出结果,用 left和 right 表示4) 此时若left为空,那最终结果只要看 right;若 right为空,那最终结果只要看 left5) 如果 left和 ri...原创 2020-04-23 11:58:40 · 484 阅读 · 0 评论 -
左神算法课程笔记PART1:二分、排序、栈、队列、矩阵、链表、二叉树
文章目录初级班lesson1初级班lesson11.对数器:https://blog.csdn.net/weixin_39953502/article/details/795048792.master公式:3.TIP关于取中间值为什么为l+(r-l)/2,而不是(l+r)/24.归并排序思想:小范围有序在合并为大范围有序时,不会浪费小范围内已经进行过的的比较,因为小范围内已经有序。...原创 2020-04-07 22:42:27 · 272 阅读 · 0 评论 -
topK问题(大顶堆、快速选择算法)
topK问题:有 N (N>1000000)个数,求出其中的前K个最小的数。力扣原题:最小的k个数输入整数数组 arr ,找出其中最小的 k 个数。方法一:大顶堆思路:维护一个大小为k的大顶堆,遍历一次数组,初始插入k个数,然后每遍历一个数,将其与堆顶比较,若比堆顶小,则堆顶弹出,该数入堆。class Solution {public: vector<int>...原创 2020-04-05 22:44:16 · 1194 阅读 · 0 评论 -
二叉树四种遍历(迭代、递归)
题目来自leetcode:前序:https://leetcode.com/problems/binary-tree-preorder-traversal/?tab=Description中序:https://leetcode.com/problems/binary-tree-inorder-traversal/?tab=Description后序:https://leetcode.com/p...原创 2020-04-04 19:10:39 · 368 阅读 · 0 评论