算法
大-魚
奋斗中的菜鸟
展开
-
左神算法课笔记
第一节 认识复杂度、对数器、二分法与异或运算1. 认识复杂度2. 对数器对数器的实现方法:JAVA随机整数生成:3. 二分法复杂度为logn。认识二分:二分法中,为了安全,mid的下标最好用减法算出,以免加法溢出。位运算更快常见的一些位运算写法:x^2 == x << 1;x^2 + 1 == x << 1 | 1;x/2 == x >> 1;一个有原创 2022-02-14 19:08:21 · 3739 阅读 · 1 评论 -
使用二分解决最长上升子序列(LST)问题
使用二分的思路来源于一种叫做patience game的纸牌游戏。public class 二分解决最长上升子序列 { public static void main(String[] args) { int[] num = {1, 4, 5, 2, 3, 8, 6, 7, 9}; System.out.println(search(num)); } static int search(int[] nums) { int[] top原创 2021-04-21 16:02:19 · 185 阅读 · 0 评论 -
二分找最左值与最右值
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。进阶: 你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗? 示例 1:输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]示例 2:输入:nums = [5,7,7,8,8,10], target = 6输出:[-1,-1]示例 3:输入:nums =.原创 2021-04-21 15:36:18 · 225 阅读 · 0 评论 -
搜索旋转排序数组
整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。给你 旋转后 的数组 nums 和一个整原创 2021-04-21 10:07:38 · 149 阅读 · 0 评论 -
快速乘+二分实现除法
实现方法: class Solution { public int divide(int dividend, int divisor) { boolean flag = dividend > 0 && divisor > 0 || dividend < 0 && divisor < 0 ? true : false; long x = Math.abs((long) dividen原创 2021-04-21 09:45:51 · 128 阅读 · 0 评论 -
gcd与lcm函数
分别用于去最大公因数与最小公倍数//最大公因数 public static int gcd(int a, int b){ return b == 0 ? a:gcd(b,a%b); } //最小公倍数 public static int lcm(int a, int b){ return a/gcd(a,b) * b; } public static void main(String[] args) {原创 2021-04-17 22:07:13 · 362 阅读 · 0 评论 -
不一样的N皇后问题——位运算优化
N皇后问题是个很经典的问题,最近学习了使用位运算来优化对皇后位置的限制。可以加快算法的常数时间,但是时间复杂度还是没变。思路:将皇后所放的【列限制】改为实用整数位进行标志,【左斜线限制】与【右斜线限制】也使用整数位进行标志,准备一个N个位的二进制数limit,用于确定位限制中的有效范围 。 当前在第0行,想要在某一列放皇后,放入皇后之后,对应【列限制】的位改为1,代表这里要放皇后; 那么对应就会生成下一行的【左斜线与右斜线限制】,将当前行放入皇后的列限制左移1位就是下一行的左斜线限制原创 2021-04-12 15:45:46 · 341 阅读 · 0 评论 -
实现JAVA结合前向量实现Dijkstra
```javapackage com.yxs.graph1;import java.io.BufferedInputStream;import java.util.Arrays;import java.util.Scanner;import java.util.Stack;public class Dijkstra { static int MAXN = 105; static class Edge{ int to; int w; ...原创 2021-04-10 21:09:14 · 142 阅读 · 1 评论 -
Java实现Kruskal,优化的前向量结构,并查集
Kruskal思想:将所有边排序,每次选最小的边,检查这个边两个顶点是否为同一个集合,不是的话就合并,是的话就不要(会形成回路),最后选n-1个边。选边的过程可以由堆进行优化package com.yxs.graph1;import java.io.BufferedInputStream;import java.util.PriorityQueue;import java.util.Scanner;public class Kruskal { static class Edge{ int原创 2021-04-10 22:21:34 · 161 阅读 · 0 评论 -
Java实现Prim算法,结合前向向量优化
package com.yxs.graph1;import java.io.BufferedInputStream;import java.util.Arrays;import java.util.Scanner;import java.util.Stack;public class Prim { static class Edge{ int to,w,next; { to = 0; w = 0; next = 0; } } static final int原创 2021-04-10 21:54:33 · 126 阅读 · 0 评论 -
多段图问题----利用动态规划求解
首先,先说一下,这里所谓的利用动态规划求解,其实就是利用动态规划的思想。没有多么复杂,不要给自己加剧情。。。。特指本人。。。。其实利用动态规划的思想就是每次将结果保存下来,下次可以继续使用。你再想想,我们之前写最短路径不就是这样的吗????所以,这**写最短路径的时候,心理想着用个数组保存下来之前的结果不很正常吗?只不过那个时候没有意识到这里隐含了动态规划的思想。所以在老师说用动态规划求解多段图的时候,整个人都蒙了。。。。既然知道了,那么其实和写最短路径是一样的。只不过,这里我们可以倒着来,从后往前原创 2021-04-02 09:54:37 · 512 阅读 · 0 评论 -
归并排序!!!!!!一定要注意递归的边界维问题
private static void print(int[] arr){ for(int i = 0;i < arr.length;i++){ System.out.print(arr[i] + " "); } System.out.println(""); } public static void sort(int[] arr, int l, int r){ if(r == l)ret...原创 2021-03-29 20:16:21 · 213 阅读 · 0 评论 -
插入排序与希尔排序
首先看java实现插入排序;public static void sort(int[] arr){ int pos; for(int i = 1;i < arr.length;i++){ int t = arr[i]; pos = i; for(int j = i;j > 0 && t < arr[j-1];j--){ arr[j] =原创 2021-03-29 17:03:18 · 80 阅读 · 0 评论 -
冒泡排序及优化
冒泡排序及优化首先看一般的冒泡排序算法:public static void sort(int[] arr){ for(int i = arr.length;i > 0; i--){ for(int j = 1;j < i;j++){ if(arr[j] < arr[j-1])swap(arr, j, j-1); } } }优化冒泡排序主要有两种方式。一是从外层原创 2021-03-29 16:35:02 · 172 阅读 · 0 评论 -
选择排序的优化——JAVA实现
思想:最原始的选择排序,是每一次遍历数组,找出最小或最大的元素,然后交换到头或者尾部。优化思想也很简单,每次遍历选择出最大和最小的元素,分别放在头部和尾部。public static void sort(int[] arr){ int min = 0; int max = arr.length; for(int i = 0 ;i < arr.length / 2 + 1;i++) { min = i;原创 2021-03-29 13:23:28 · 143 阅读 · 0 评论 -
青蛙的约会POJ1061
公青蛙一开始在x位置,母青蛙在y位置。公青蛙每次跳m米,母青蛙每次跳n米,并且都是向右跳的。地球经线长度是L,然后地球是圆的,也就是说,跳到L、L+1、L+2……其实就是跳到0、1、2。 公青蛙想追母青蛙,问多少次后它们能跳到一起。如果它们永远不能相遇,就输出Impossible(好可怜啊!)很明显嘛,就是求一个k,使x + k*m ≡ y + k*n (mod L) 嘛,木有错吧?至少我是...转载 2020-03-15 17:10:11 · 109 阅读 · 0 评论 -
怎样快速求一个数有多少个约数?
首先把这个数先用2、3、5、7、11、13、......等质数的连乘积表示。比如24 = 2*2*2*3 = 2³ * 3再用各个质数的指数加一后再相乘即为此数的约数个数,比如 (3+1)*(1+1)=4*2=8, 即表示24有8个约数。例如:1200000 = 2^7 * 3 * 5^5;所以约数个数有(7+1) * (1+1) * (5+1) = 8 * 2 * 6 =96...原创 2020-03-14 11:40:11 · 8734 阅读 · 3 评论 -
挑战笔记
挑战程序设计竞赛笔记1. 第二章2.1 最基础的穷竭算法经典dfs部分和问题,做了一点小改动,主要是我习惯用初始下标为1.#include<cstdio>#include<algorithm>#include<cmath>#include<iostream>#include<queue>#include<sta...原创 2020-03-04 08:21:22 · 139 阅读 · 0 评论 -
计蒜客蓝桥杯坑点
参加了计蒜客的蓝桥杯模拟赛,在做一道迷宫问题的时候,最开始用dfs做,超时了。后来才想起来此类问题应该用bfs做,然后做的时候又发现了坑点。。。。题目:输入:3 4..*...*...*.22 2 2 43 1 1 43 4输出:3解题思路:这道题直接用bfs求最短路即可,需要注意的就是传送门这个坑。一般情况下我们考虑的是一个点传送到另一个点就完了...原创 2020-01-21 10:28:21 · 445 阅读 · 0 评论 -
线段树的lazy标记进行 区间加 + 区间修改 + HDU - 1698 + Horrible Queries LightOJ - 1164
问题HDU - 1698大意:给定一排n个铜棍,他们的初始价值为1,现在有q种操作,可以将[x,y]区间内的棍子改为铜棍(价值为1),银棍(价值为2),金棍(价值为3)。问最后所得的所有棍子的价值为多少?思路:使用线段树来保存各个区间的总价值。 关于将区间[x,y]进行更新,我们使用lazy数组进行标记,其代表当前区间结点的子区间应该被修改的值(只有在更新和查询需要用到其子区间时才会...原创 2020-01-17 09:50:31 · 175 阅读 · 0 评论 -
Ultra-QuickSort OpenJ_Bailian - 2299 逆序对 + 树状数组 + 离散化(通过结构体重新排序实现)
题目大意:输入一个数组序列,要求整个序列进行冒泡排序时,每个元素需要交换位置的总次数。输入:输入包含几个测试用例。每个测试用例均以包含单个整数n <500,000(输入序列的长度)的一行开头。接下来的n行中的每行都包含一个整数,即0≤a [i]≤999,999,999,即第i个输入序列元素。输入由长度为n = 0的序列终止。不得处理此序列。输出:对于每个输入序列,程序将打印一...原创 2020-01-16 18:02:55 · 154 阅读 · 0 评论 -
POJ - 2352 树状数组 + 思维
题目大意:给定n对x与y坐标,求[0,n-1]不同等级下的点的个数。每个点的等级取决于:位于该点下方以及左方的点的个数。思路:利用一个树状数组维护不同区间下星星的个数;对输入的坐标对按照y排序,y相同的按照x排序(升序)。这样一来,直接使用树状数组维护[1,x]的星星的个数即可,因为每次新加入树状数组的点的等级必将大于等于上一个点的等级。题目给出的坐标可能是0,所以对x坐标进行+1处理。...原创 2020-01-15 22:43:48 · 251 阅读 · 0 评论 -
HUD-3333 离线 + 树状数组 + 区间不同值和 + 思想
第一次做这种题,没有这种思想,总结一下。HUD-3333是一道求解指定区间内不重复元素的和值。由于输入数据特别大,还不会离散化,因此使用map映射不同值。题目大意:现在给定N个数字序列A1,A2,...,AN和多个Queries(i,j)(1≤i≤j≤N)。对于每个Query(i,j),您将计算子序列Ai,Ai + 1,...,Aj中不同值的总和。输入第一行是整数T(1≤T...原创 2020-01-15 21:03:55 · 149 阅读 · 0 评论 -
二进制和最长公共子串快速判断两个字符串是否含有相同字符
bool ok(int a, int b){ memset(mark, 0, sizeof mark); int len1 = strlen(rec[a]); int len2 = strlen(rec[b]); for(int i = 0;i < len1;i++){ mark[0] |= 1 << rec[a][i] - 'a'; } for(int i =...原创 2020-01-13 11:02:55 · 320 阅读 · 0 评论 -
并查集优化模板
一,首先是查找优化模板,如果数据不大直接手动合并,配合一下查找方式即可ACint find(int x){ while(x != p[x]){ p[x] = p[p[x]]; x = p[x]; } return x;}这种方式适合于将并查集各个节点的p值初始化为本身的情况,防止爆栈。二,但节点数更多,并且需要记录各个集合的数据个数时,使用根节点负数存储优化,每...原创 2020-01-12 15:41:21 · 270 阅读 · 0 评论 -
算法竞赛中碰到的坑————自己写的程序不小心跳过下一组输入样例,直接GG
这道题是一道完全背包的模板练习题,其中的问题在哪?好像没有问题。。。。但是提交就是WrongAnwser,其原因是因为我的输入样例还没有接受完成,我就直接continue了,所以下一组样例进来的时候,肯定就错误了噻!!!!#include<cstdio>#include<algorithm>#include<cstring>using namesp...原创 2019-12-21 13:05:18 · 192 阅读 · 0 评论 -
贪心+二分求最大上升子序列
题目描述:求最大上升子序列,利用贪心+二分的思想,关键注释都在代码块中了。学习来源链接:https://blog.csdn.net/lxt_Lucia/article/details/81206439,感谢大佬的博客#include<cstdio>#include<iostream>#include<cstdlib>#include<...原创 2019-12-14 16:45:24 · 201 阅读 · 0 评论 -
引爆炸弹 - 计蒜客
本题中,直接使用DFS去引爆炸弹,而不是使用DFS去遍历每一个点,这样就不必再使用方向向量去搜索。#include<cstdio>#include<iostream>#include<algorithm>int MM[1005][1005], n, m, number;bool row[1005], col[1005];void dfs(int...原创 2019-11-30 11:58:59 · 140 阅读 · 0 评论 -
算法中的输入数据的坑(一)
题目是:The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large rectangular region of land at a time, and creates a grid that divi...原创 2019-11-23 11:05:28 · 268 阅读 · 0 评论 -
POJ 3414倒水问题
编程半小时,差错8小时#include<iostream> #include<cstdio>#include<map>#include<stack>using namespace std;struct Node{ int id; int k1,k2; int pr; int step; int op;}Q[110*110]...原创 2019-11-22 10:25:31 · 124 阅读 · 0 评论 -
Given a positive integer n....
Given a positive integer n, write a program to find out a nonzero multiple m of n whose decimal representation contains only the digits 0 and 1. You may assume that n is not greater than 200 and there...原创 2019-11-16 11:02:04 · 2299 阅读 · 0 评论 -
算法学习之———堆排序
1.堆是实现优先队列的首选数据结构,最常见的是二叉堆。2.堆的性质:小顶堆:每一个父节点的值总是不大于它的孩子节点的值。大顶堆:每一个父节点的值总是不小于它的孩子节点的值。堆包含的操作有:insert()(插入操作),extractmin()提取最小(用于小顶堆),exectractmax()提取最大(用于大顶堆),peek()读取,delete()删除。3.由于堆是一颗形...原创 2019-09-26 17:04:57 · 154 阅读 · 0 评论 -
算法学习之希尔排序
算法学习之希尔排序:希尔排序是在插入排序的基础之上,优化了时间效率而开发出来的排序算法,其讲普通直接插入排序的O(n*n)的时间复杂度降为了O(nlogn)的时间复杂度,是第一个打破n*n时间复杂度的算法。因此我们有必要好好学习一下这个算法,掌握它的思想。主要思想:希尔排序算法通过间隔值划分,将待排序数组分为了几个逻辑上的序列,如下:间距值为k,待排序数组为A[n],通过间隔值,将数...原创 2019-09-25 22:56:04 · 484 阅读 · 0 评论 -
01背包之第K优解问题详解
求前k优解的基本思想是将两个状态都表示成有序队列,将状态方程中的max/min转化成有序队列的合并。现在不太清楚这一句话没有关系,看以下分析:首先,作为01背包问题的一个提升,弄懂第K优解问题之前需要明白01背包问题。这里就不再重述,直接给出01背包问题的动态转换方程。 ...原创 2019-09-06 13:52:29 · 1392 阅读 · 0 评论