小技巧
算法中的一些小技巧
__anonymous_
Stay hungry, stay foolish.
展开
-
小技巧 ----- Java算法题标准模版
模版import java.util.*;import java.io.*;import java.math.*;class Main { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String[] sp; BufferedWriter log = new BufferedWriter(new OutputStreamWriter(System.out)); /* 定义全局变量原创 2020-10-29 16:11:15 · 182 阅读 · 0 评论 -
小技巧 ----- 计数数组中小于 target 的元素个数
二分flag + 前缀和原创 2020-10-27 18:18:19 · 211 阅读 · 0 评论 -
小技巧 ----- 枚举整数的每一位数字
使用字符串int num = 12345;char[] c = String.valueOf(num).toCharArray();for (int i = 0; i < c.length; i++) { // c[i] - '0' 就是整数 num 从左到右的数字}先%10再/10int num = 12345;int x = num;while (x > 0) { int i = x % 10; x /= 10; // 这里的数字 i 就是整数 num 从右到左的数原创 2020-10-25 16:12:47 · 383 阅读 · 0 评论 -
常用代码模板1 ----- 基础算法
一维前缀和求一维前缀和数组:从下标1开始记录for(i = 1 ... n) s[i] = s[i - 1] + a[i]从下标0开始记录s[0] = a[0]for(i = 1 ... n) s[i] = s[i - 1] + a[i]根据前缀和数组求a数组[l, r]区间和:sum = s[r] - s[l - 1]二维前缀和求二维前缀和数组:行列均从下标1开始记录for(i = 1 ... n) for(j = 1 ... m) S[i][j] = S[i -原创 2020-10-24 19:38:10 · 161 阅读 · 0 评论 -
模版 ----- DP
动态规划解题思路以01背包问题为例一、状态表示dp[ i ][ j ]根据枚举思想抽象出一种集合步骤:明确问题目的01背包问题的目的是从一堆有权重和体积的物品中存放到一定体积的背包中,要求找到能让放在背包中的物品总价值和最大那种取法。根据枚举思想抽象出集合问题的目的是找到最佳取法,那么根据枚举思想,我们需要枚举出所有的取法,那么抽象出来的集合就是:从前 i(0 ~ n) 个物品中考虑并且选出的物品总体积不能超过 j(0 ~ m),每种不同的 i、j 取值对应着不同的集合。原创 2020-10-14 13:44:47 · 173 阅读 · 1 评论 -
模版 ----- 一维前缀和与二维前缀和
一维前缀和795. 前缀和a[i] 的前 i 项和 s[i] 的递推公式:s[i]=s[i−1]+a[i]s[i] = s[i - 1] + a[i]s[i]=s[i−1]+a[i]求出在 [l, r] 区间的和:sum[l,r]=s[r]−s[l−1]sum[l,r]=s[r]-s[l-1]sum[l,r]=s[r]−s[l−1]注意 a[i] 和 s[i] 均从下标1开始记录数据import java.util.*;import java.io.*;public class Main原创 2020-10-13 09:35:54 · 112 阅读 · 0 评论 -
模版 ----- 实数二分
模版// 这里根据题目要求保留结果几位小数来决定,如果保留4位小数则是1e-6(多开2位)while (r - l > 1e-6) { double mid = (r + l) / 2; if (mid在二段性右边) r = mid; else l = mid;}// 上面的循环结束后,r无限接近于l,此时的r和l即为二段性的分界点应用790. 数的三次方根思路:数据范围在 [-10000,10000] 之间,即被开方数取值在这之间那么其三次方根一定在 [-10000,1原创 2020-10-11 12:30:13 · 178 阅读 · 0 评论 -
小技巧 ----- Java中指定保留几位小数
方法1:使用String类的format方法String.format("%.6f", 小数),表示将该数保留6位小数方法2:使用BigDecimalBigDeciaml divide(BigDecimal divisor, int scale, RoundingMode roundingMode)(1) scale参数:设置小数位数(2) roundingMode参数:设置小数舍入模式详见:常用类 (三) ----- BigDecimal和BigInteger大数类...原创 2020-10-11 12:04:47 · 1165 阅读 · 0 评论 -
模版 ----- 一维指数型枚举 & 排列型枚举 & 组合型枚举
应用场景给定x个方格,每个方格可以存放0或者1两个状态(状态可以多个不一定只有2个)枚举出这n个方格的所有状态情况递归树模型:标准的x叉树,每个分支表示对于同一个方格的所有不同状态选择情况时间复杂度:O(xn)O(x^n)O(xn)代码模版import java.util.*;public class Main { Scanner s = new Scanner(System.in); // 方格数量 int x; // 每个方格对应的状态原创 2020-09-21 22:28:00 · 251 阅读 · 0 评论 -
模版 ----- 整数二分
整数二分思想确定一个区间,使得目标值一定在这个区间内从题目中找到一种性质:该性质具有二段性,比如一个数组的前半段元素符合该性质,后半段元素就不符合该性质了目标值一定为二段性的分界点处即:目标值可能在前半段的右端点,或者后半段的左端点根据上述的性质,具体可以把整数二分划分为两大类问题第一类:目标值是前半段的右端点将[L,R][L, R][L,R]分成 [L,mid−1][L, mid-1][L,mid−1]和[mid,R][mid, R][mid,R]如果midmi原创 2020-09-21 09:34:44 · 101 阅读 · 0 评论 -
小技巧 ----- 位运算的一些结论与应用
乘2与除2 (左乘右除)// 左乘10 << 1 = 20// 右除10 >> 1 = 10注意:被运算的数字始终在左边2的n次方1 << n = 2的n次方1 << 10 = 2的10次方注意:次方数始终在右边判断一个十进制数的二进制串的某一位数字是0 or 1// 判断二进制串1110的第3位(最低位为第0位)是数字1还是014 >> 3 & 1 // 运算结果为1应用:通过二进制串的位运算进原创 2020-09-20 13:12:15 · 1276 阅读 · 0 评论 -
小技巧 ----- 通过二进制串的位运算进行二维指数型枚举
二维指数型枚举题目:给定4x4矩阵(每个元素为1或0)枚举出所有情况,在矩阵元素为1的位置执行turn()方法思路:把4x4方格看作一个一维的水平长度为16的方格即现在需要枚举一个长度为16的二进制串将二进制串翻转过来,想象把其下标标记到矩阵的每一个元素上0 1 2 34 5 6 78 9 10 1112 13 14 15用(i, j)扫描上面抽象出来的矩阵,将坐标(i, j)转化为二进制串的对应的下标二进制串原创 2020-09-20 13:00:00 · 181 阅读 · 0 评论 -
小技巧 ----- 二维数组中通过(x, y)的偏移量来遍历(x, y)周围的元素
应用场景给定一个二维数组和一个点(x, y)要求遍历点(x, y)十字形范围的点,包括(x, y)结论首先把这个二维数组竖下方向看作x轴,横右方向看作y轴找到点(x, y)关于其上下左右点的偏移量放在两个数组中遍历时把x, y加上对应的偏移量就相当于遍历了(x, y)十字形范围且包括(x, y)的点// 找到(x, y)的x关于其上下左右点的偏移量int dx[] = {-1, 0, 1, 0, 0};// 找到(x, y)的y关于其上下左右点的偏移量int dy[] = {0原创 2020-09-18 19:07:09 · 738 阅读 · 0 评论 -
小技巧 ----- 通过二进制串的位运算进行一维指数型枚举
使用场景给定n个方格每个方格里面可以放1或0那么所有存放的情况一共有2n2^n2n种枚举出所有情况二进制串的位运算结论给定一个二进制串,如101011从左到右可以规定其下标为:5 4 3 2 1 0那么43 >> 2 & 1可以判断:二进制串101011下标为2处的数字是否为1通过二进制串的位运算进行指数型枚举// 63的二进制串为111111// 枚举出6个方格的所有存放情况// 计数第1个方格为1并且最后1个方格为0的情况数int cnt = 0;原创 2020-09-18 01:08:26 · 208 阅读 · 0 评论 -
小技巧 ----- Java算法题中的输入输出
输入操作一般使用Scanner s = new Scanner(System.in);Scanner类中的常用方法方法描述String next()接受的字符串以空格划分且不包含\nString nextLine()接收的字符串以行划分且包含\nint nextInt()接收一个整型值输出操作System.out.println()-----当输出大量数据的时候效率很低BufferedWriter log = new BufferedWriter(原创 2020-09-16 22:06:33 · 1726 阅读 · 1 评论 -
小技巧 ----- Java中的进制转换
自带的APIInteger.parseInt(数, 数对应的进制)/Integer.valueOf(数, 数对应的进制) ----- 将不同进制数转为十进制数Integer.toString(十进制数, 指定进制) ----- 将十进制数转为对应进制数原创 2020-09-16 21:54:19 · 302 阅读 · 0 评论 -
小技巧 ----- 关于Java中的System.arraycopy()
使用方法:传入5个参数:System.arraycopy(来源数组, 起始下标, 目标数组, 起始下标, 拷贝长度)使用技巧:数组的位移通过该方法进行数组的位移:System.arraycopy(arr, i1, arr, i2, arr.length - i2)i1:待位移的子序列起始下标i2:首元素移动到数组的哪个下标上注意点:该方法只能进行一维数组拷贝二维数组拷贝的方式:int[][] arr1 = {{1, 2, 3}, {4, 5, 6}};int[][] arr原创 2020-09-16 21:51:06 · 151 阅读 · 0 评论