种花问题
种花问题
问题陈述
假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给定一个花坛(表示为一个数组包含0和1,其中0表示没种植花,1表示种植了花),和一个数 n 。能否在不打破种植规则的情况下种入 n 朵花?能则返回True,不能则返回False
12345输入: flowerbed = [1,0,0,0,1], n = 1输出: True输入: flowerbed = [1,0,0,0,1], n = 2输出: False
思路分析
根据题意,需有三个连续的空位才能栽一树花,另外考虑边界情况。贪心的思想。
代码实现
12345678910public boolean canPlaceFlowers(int[] flowered,int n){ int count=0; for(int i=0;i<flowered.length;i++){ if(flowered[i]==0 && (i==0 || flowered[i-1]==0) ...
硬币
硬币
问题陈述
硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007)
12345 输入: n = 5 输出:2 解释: 有两种方式可以凑成总金额:5=55=1+1+1+1+1
代码实现
1234567891011121314public class Solution{ public int waysToChange(int n){ int[] dp=new int[n+1]; int[] coins=new int[]{1,5,10,25}; dp[0]=1;//组成面值为0的硬币情况,即不使用任何硬币,也视为一种情况。 for(int coin:coins){ for(int i=coin;i<=n;i++){ dp[i]=(dp[i]+dp[i-coin])%1000000007; ...
看见海
彼时只是一个生于内陆的孩童,第一次知道海也许是二年级人教版语文课本里的一首诗,每次讲诗,并不解其意,只是读起来朗朗上口,于是老师让我们读起来,是王之涣的《登鹳雀楼》:
白日依山尽,黄河入海流,欲穷千里目,更上一层楼。
印象中是第一次听闻海,知道了海大概是一片茫无际涯的大水。后来四年级的时候,学了巴金的《海上日出》,而且课文底页是附图的,对海就十分有了好感,再后来,初一下学期学到林海音的《爸爸的花儿落了》,是夹竹桃,后面看见夹竹桃总要想起来书中的主人公英子,那个因为下雨天赖床不起然后被爸爸拿起鸡毛掸子打起被宋妈抱上洋车的英子,校园里早读书声琅琅,窗外玉簪花在雨中莹润饱满。后面夹竹桃落了,爸爸的病愈加严重,那个齐肩发的女孩英子在台阶上泣不成声的落泪,而此刻弟弟妹妹还在打闹玩耍,她长大了,在校园礼堂为她们六年级毕业生唱完“长亭外,古道边,芳草碧连天”后,然后是一个小小的大人了,也曾在六年级国文课学到一篇文章《我们看海去》:
我们看海去!
我们看海去!
蓝色的大海上,
扬着 ...
目标和
目标和
问题陈述
给定一个非负整数数组,a1, a2, …, an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。
返回可以使最终数组和为目标数 S 的所有添加符号的方法数。
12345678910111213输入:nums: [1, 1, 1, 1, 1], S: 3输出:5解释:-1+1+1+1+1 = 3+1-1+1+1+1 = 3+1+1-1+1+1 = 3+1+1+1-1+1 = 3+1+1+1+1-1 = 3一共有5种方法让最终目标和为3。
方法一:枚举
1234567891011121314151617class Solution{ int count=0; public int findTargetSumWays(int[] nums,int s){ calculate(nums,0,0,s); return count; } public void calculate(int[] nums,int i,i ...
江南好
江南好
白乐天忆江南词
忆江南三首
其一
江南好,风景旧曾谙;日出江花红胜火,春来江水绿如蓝。能不忆江南?
其二
江南忆,最忆是杭州;山寺月中寻桂子,郡亭枕上看潮头。何日更重游?
其三
江南忆,其次忆吴宫;吴酒一杯春竹叶,吴娃双舞醉芙蓉。早晚复相逢?
青简填忆江南词咏杭州七首
杭州好,风景四时多。
春日寻芳秋赏月,冬来飞雪夏观荷,
湖上有清歌。
杭州好,雨后碧山深。
千树烟云千笔画,九弯溪水九张琴,
宜作梦中吟。
杭州好,灵隐渡无涯
白乐桥边才买醉,法云村里又求茶,
槛外是吾家。
杭州好,仙境彩云栖。
山径好行留梦去,竹枝堪折带愁吹,
惊起鸟相啼。
杭州好,春日梦三台。
也织芳菲为锦绣,更铺云水作衣裁,
妆罢待谁来。
杭州好,龙井问新茶。
一盏为谁沏雨露,七杯同我饮烟霞,
归去泛仙槎。
杭州好,最忆是西溪。
秋染柿林红胜火,春来梅墅雪如瓷。
无日不逢时。
汉明距离
汉明距离
问题陈述
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x 和 y,计算它们之间的汉明距离。
12345678输入: x = 1, y = 4输出: 2解释:1 (0 0 0 1)4 (0 1 0 0) ↑ ↑
内置函数法
12345class Solution { public int hammingDistance(int x, int y) { return Integer.bitCount(x ^ y); }}
异或逐位判断法
12345678910111213class Solution{ public int hanmingDistance(int x,int y){ int ps=x^y; int distance=0; while(ps!=0){ if(ps%2==1){ distanc ...
每日温度
每日温度
问题陈述
请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
问题求解
双指针
1234567891011121314class Solution { public int[] dailyTemperatures(int[] T) { int[] res=new int[T.length]; for(int i=0;i<T.length;i++){ for(int j=i+1;j<T.length;j++){ if(T[j]>T[i]){ res[i]=j-i; ...
正向代理和反向代理
正向代理和反向代理
正向代理
正向代理(forward proxy):是一个位于客户端和目标服务器之间的服务器(代理服务器),为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端。
这种代理其实在生活中是比较常见的,比如访问外国网站技术,其用到的就是代理技术。有时候,用户想要访问某国外网站,该网站无法在国内直接访问,但是我们可以访问到一个代理服务器,这个代理服务器可以访问到这个国外网站。这样呢,用户对该国外网站的访问就需要通过代理服务器来转发请求,并且该代理服务器也会将请求的响应再返回给用户。这个上网的过程就是用到了正向代理。
这个过程其实和租房子很像。租房子的时候,一般情况下,我们很难联系到房东,因为有些房东为了图方便,只把自己的房屋信息和钥匙交给中介了。而房客想要租房子,只能通过中介才能联系到房东。而对于房东来说,他可能根本不知道真正要租他的房子的人是谁,他只知道是中介在联系他。
所以,正向代理,其实是"代理服务器"代理了"客户端",去和"目标服务器& ...
机器人的运动范围
机器人的运动范围
问题陈述
地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?
DFS深度优先遍历
深度优先搜索: 可以理解为暴力法模拟机器人在矩阵中的所有路径。DFS 通过递归,先朝一个方向搜到底,再回溯至上个节点,沿另一个方向搜索,以此类推。
剪枝: 在搜索中,遇到数位和超出目标值、此元素已访问,则应立即返回,称之为 可行性剪枝 。
算法解析:
递归参数: 当前元素在矩阵中的行列索引 i 和 j ,两者的数位和 si, sj 。
终止条件: 当 ① 行列索引越界 或 ② 数位和超出目标值 k 或 ③ 当前元素已访问过 时,返回 0 ,代表不计入可达解。
递推工作:
标记当前单元格 :将索引 (i, j) 存入 Set vis ...
朋友圈
朋友圈
问题陈述
班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。
给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。
1234567输入:[[1,1,0], [1,1,0], [0,0,1]]输出:2 解释:已知学生 0 和学生 1 互为朋友,他们在一个朋友圈。第2个学生自己在一个朋友圈。所以返回 2 。
思路分析
上述矩阵可视为图的邻接数组表示。
问题即变成寻找无向图的连通分支数。
DFS
123456789101112131415161718192021public class Solution{ public int connectFiends(int[][] M){ int[] visited= new int[M.length]; ...