/images/avatar.jpg

我的个人博客

广度优先问题问题

机器人的运动范围 ### 解题思路 采用广度优先搜索的方式 广度优先通常采用队列的方式,以一种平铺的方式进行计算 移动方向:我们可以只定义向下和向右进行移动 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 class Solution { public int movingCount(int m, int n, int k) { Deque<int[]> deque = new ArrayDeque<>();//定义一个队列,由于添加删除状态 int[] dx = {1, 0};//右移一位 int[] dy = {0, 1};//下移一位 boolean[][] vis = new boolean[m][n];//定义一个boolean二维数组用于确定该坐标是否被添加 vis[0][0] = true;//坐标[0][0]一定会被使用的,因此将其初始化为true deque.

01背包问题

n件物品,它们装入背包所占的容量分别为w1、w2……wn;它们所拥有的价值分别为p1、p2 ……p n; 有一个总容量为C的背包; 在装满背包的情况下,如何使得包内的总价值最大? 该问题的特点是:每个物品仅有一个,可以选择放或者不放,也就是说每个物品只能使用一次。 首先我们定义一个变量$B(i,j)$表示当背包容量为j,前i个物品(第1个到第i个)的情况下包内的最大价值。 即有i个物品,背包的容量为j,此时的包内的最大价值。 我们对每一件物品进行编号,可以列出以下表格: 行表示背包的容量,列表时背包的编号;为了便于操作,我们将0也加入了表格之中。 现在来分析$B(i,j)$的情况,首先明确一点,为了求出$B(i,j)$,我们可以利用之前的状态。 $$ B(i,j)=\left{ \begin{array}{lcl} B(i-1,j) &if &w[i]>j \ max{ [B(i-1,j)]; [B(i-1,j-w(i))+p(i)] } &if &w[i]<=j \end{array}\right. $$ 对于情况$w[i]>j$表示第i个物品的重量大于背包容量,所以此时不能够放入第i个物品进背包内,只能够放弃,因此这种情况下只能够考虑前i-1个物品,即:$B(i-1,j)$ 对于第二种情况,当前背包能够放入第i个物品。这时我们需要考虑两种情况:1.放入第i个物品;2.不放入第i个物品;因此我们需要在这两种情况中选出一个最大值; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 public class pack { public static void main(String[] args) { int[] w={0,2,3,4,5};//各物品体积 int[] p={0,1,2,5,6};//各物品价值 int c=8;//背包总容量 int x=w.

动态规划问题

动态规划解题的4个步骤 定义子问题(重叠子问题) 写出子问题的递推关系 确定DP数组的计算顺序 空间优化(可选) 打家劫舍 采用一维数组的动态规划 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 // 问题转化为:给定长度为n的数组,如何取最大的和(在满足条件的情况下) class Solution { public int rob(int[] nums) { int len=nums.length; if(len==0) return 0; if(len==1) return nums[0]; int[] dp=new int[len]; dp[0]=nums[0]; dp[1]=Math.max(nums[0],nums[1]); for(int i=2;i<len;i++){ dp[i]=Math.max(dp[i-1],dp[i-2]+nums[i]); } return dp[len-1]; } } 打家劫舍 II 采用两个一维数组的动态规划 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 class Solution { public int rob(int[] nums) { int len = nums.

丑数

date: 2021-02-04T09:17:30+08:00 参考 可以采用动态规划的想法! 第n个丑数$x_n$,它必然为一下三种情况之一: $$ x_n= \left{ \begin{array}{rcl} x_a \times 2 \ x_b \times 3 \ x_c \times 5\ \end{array}\right. $$ 其中$x_a , x_b ,x_c $是未知数。 为了保证不会遗漏某个丑数,$x_n$必然等于: $$ x_n=min{x_a \times 2,x_b \times 3,x_c \times 5 } $$ 这里我们需要明确的是一个丑数乘上2或3或5还是一个丑数 这里因为我们要在${x_a \times 2,x_b \times 3, x_c \times 5}$中挑选出最小的一个丑数,我们可以这样考虑,假设存在三个数组,分别用第一个丑数乘上2,3,5 1 2 3 4 5 6 7 nums2={1*2,2*2,3*2,4*2,5*2,6*2,8*2...} nums3={1*3,2*3,3*3,4*3,5*3,6*3,8*3...} nums5={1*5,2*5,3*5,4*5,5*5,6*5,8*5...} # 注意 7 不是丑数. # 2, 3, 5 这前 3 个丑数一定要乘以其它的丑数, 所得的结果才是新的丑数, 所以上例中没有出现 7*2, 7*3, 7*5 那么, 最终的丑数序列实际上就是这 3 个有序序列对的合并结果, 计算丑数序列也就是相当于 合并 3 个有序序列。 合并 3 个有序序列

位运算的基本知识

参考 1 >>> 运算符会用0填充高位,这与 >> 不同,其会用符号位填充高位。不存在 <<< 运算符 例1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class Solution { // you need to treat n as an unsigned value public int hammingWeight(int n) { /* * 采用位运算的方式 * 利用n与1进行与操作,即可判定n的最后一位是否为1,如果为1,res加1,否则不加 * 然后将n右移一位,知道n=0 * */ int res=0; while (n!=0){ res+=(n&1); n=n>>>1; } return res; } } 例2

Linux相关

Linux中tty是什么 tty:终端设备的统称。 tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被键盘与显示器取代,所以现在叫终端比较合适。终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。 tty1~6是文本型控制台,tty7是X Window图形显示管理器。 在本地机器上可以通过Ctrl+Alt+F1(F1-F7键)切换到对应的登录控制台。 所谓的窗口环境就是:文字界面加上X窗口软件!文字界面一定是存在的,只是窗口界面软件看你要不要启动而已 快捷键 Tab:命令和文件名补全; Ctrl+C:中断正在运行的程序; Ctrl+D:结束键盘输入(End Of File,EOF) 帮助 1. –help 指令的基本用法与选项介绍。 2. man man 是 manual 的缩写,将指令的具体信息显示出来。 当执行 man date 时,有 DATE(1) 出现,其中的数字代表指令的类型,常用的数字及其类型如下: 代号 类型 1 用户在 shell 环境中可以操作的指令或者可执行文件 5 配置文件 8 系统管理员可以使用的管理指令 3. info info 与 man 类似,但是 info 将文档分成一个个页面,每个页面可以跳转。 4. doc /usr/share/doc 存放着软件的一整套说明文件。 关机 1.