Compose TextField详解 TextFieldState是CoreTextField完成构建各类组件的对象以及声明剩余输入框样式及内容的状态state之后开始构建支持TextField样式渲染的各种Modifier。以此可以理解,Compose布局的过程是先测量到布局到渲染,所以构建各类对象再构建各种Modifier的顺序理应如此。针对所谓的文本内容超过TextField的显示区域,会出现Scroller滚动条来动态查看所输入的内容;相较于Text,TextField需要提供可输入的能力以及渲染效果动态更新的能力。
力扣1146 快照数组 对于get方法,若没有构建数组存储每个时刻的数据而是直接记录版本更新情况的话,在二分查找时所检索的不是等于当前snap_id的记录,而是需要找到索引list中小于snap_id的第一个元素(因为同一个index出,可以有多个快照号相同的记录);因此二分查找使用红蓝染色法,返回left。的思路不构建数组,而是保存每个数组位置set的记录,记录采用的是键值对的形式,键为当前快照号,值为传递过来需要修改的val;思路:初始时,使用的思路是对于每个快照的数组都进行一次副本保存,但是提交后是时间超出。
代码随想录算法训练营总结篇 说回自己的刷题过程,自己在完成求解后,其实很少会再去学习一遍其他的解法了,除非自己的方法是效率低下的,想要找寻更优的方法。回溯算法比较清晰,回溯题给人的感觉一般也是很明朗的,我也非常喜欢回溯题,其他包括线性表的题目,字符串的题目以及列表等的题目,在没有接触动态规划前,其实刷题还是蛮有信心的,除了N皇后、飞机票、数独还有三数之和和四数之和那几道绞尽脑汁的题目,其他真的是每天都刷的很有趣,但是动态规划题目把我打回原形,以前的我也是对于动态规划一直不太理解,但是这次是真正感受到了动态规划求解的一些思路。
代码随想录算法训练营day30 || 332.重新安排行程(未完成),51. N皇后,37. 解数独(未完成) 【代码】代码随想录算法训练营day30 || 332.重新安排行程(未完成),51. N皇后,37. 解数独(未完成)
代码随想录算法训练营day64 || 84. 柱状图中最大的矩形 首先补充昨天接雨水题目解法的更新,中给出双指针和单调栈的解法,其中所采用的思想是计算每一列可以容纳的雨水,非常的关键,是指导双指针的重要思想。双指针的核心思路是对于每一列,其所容纳的雨水量必定取决于左右两侧的最高高度,即每一列考虑自身是出于山谷的中间还是两边;这是所有可以容纳雨水的情况;山峰的情况是必定容纳不了雨水的。而双指针的优化是使用了数组存储各个位置所记录的单边最大高度,有一点动态规划的思想。双指针的求解思路非常的厉害;单调栈也是延续这一个思想,栈内以递增的顺序进行元素的存储。
代码随想录算法训练营day63 || 53. 下一个更大元素,42. 接雨水 快指针随着数组遍历而移动,慢指针总是指向height不为零的位置,那么如何在快指针访问的位置适时的赋予慢指针呢?观察求和填雨水的求法,我们需要比较快慢指针所指向位置的高度,选择较小的来计算。单调栈从栈首至栈尾是递增,所以如果出栈的情况,那么一定是可以有雨水可接。但是需要注意栈中存在32101这样的山谷状,此时出栈一次求取的是最山谷部分的雨水量,其他部分可以随着后续出栈操作而更新,但是需要需要减去先前已出栈部分的。举个例子4,2,1,3,0,5,如果不额外计算一步的话,橙色块的雨水就没有能够记录下来。
代码随想录算法训练营day59 || 583. 两个字符串的删除操作,72. 编辑距离 所以不管是dp[i-1][j],dp[i][j-1],dp[i-1][j-1]都是属于对s或者t进行了一次编辑。本题dp[i-1][j],dp[i][j-1]都是删除操作,dp[i-1][j-1]与dp[i][j]而言是替换操作;因为这个替换体现在dp[i][j]会得到dp[i-1][j-1]+1,即我默认通过替换一个元素使得s[i]与t[j]相等了,那么自然转移到的前一状态就是dp[i-1][j-1]。所以在字符题,用动态规划求解的话,发生转移的条件就是判断s[i]与t[j]的相等或不相等。
代码随想录算法训练营day58 || 392. 判断子序列115. 不同的子序列 因此s不选当前的位置,即类似于两者不是合适的匹配元素,要找其他的元素,所以此时是要延续上一状态dp[i-1][j],这里是在s中找有几个t,所以只会由s来判断当前t位置的元素我是否选择,所以仅仅是dp[i-1][j],而不考虑dp[i][j-1];而站在 编辑距离 的角度来看,这个dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1])的操作就是删除i位置元素或删除j位置元素,从而求取两个字符串的共同序列。不等时,按照相等时不选择的状态延续操作,赋值dp[i-1][j]即可。
代码随想录算法训练营day57 || 1143.最长公共子序列,1035.不相交的线,53. 最大子序和 拿示例一A = [1,4,2], B = [1,2,4]为例,其实也就是说A和B的最长公共子序列是[1,4],长度为2。这个公共子序列指的是相对顺序不变(即数字4在字符串A中数字1的后面,那么数字4也应该在字符串B数字1的后面)思路:直线不能相交,这就是说明在字符串A中 找到一个与字符串B相同的子序列,且这个子序列不能改变相对顺序,只要相对顺序不改变,链接相同数字的直线就不会相交。思路:在递推方程与求公共数组的几乎类似,但是不同的是本题要求的公共序列不需要元素的连续,所以当s[i]!
代码随想录算法训练营day56 || 300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数组 心得:对于序列比较类型的题目,若使用动态规划进行求解,首先状态转换是不容易看出来的,因为序列是元素不断在访问,而不是我们前面的背包或者股票以及打家劫舍那样有充分形象的动态来形成状态,序列比较中只是遍历,遍历一个位置后整体环境没有多大变化,所以序列题目的动态规划需要从暴力求解中寻找思路,甚至可以理解为是对暴力求解的优化。其次就是序列题目需要定义一个额外的用来保存全局最大值的变量,序列题目的dp数组是一直暂存数组不同位置的状态,不一定在末尾保存的就是整个数组遍历之后的最佳值。
代码随想录算法训练营day55 || 309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费 相应的dp[i][0],第i天结束后处于不持有股票状态且不处于冷冻期;dp[i][1]表示结束时处于持有股票状态;dp[i][2]表示今天结束之后处于冷冻期状态且不持有股票。我个人理解上还是认为三个状态更加好理解,但是的确三个状态之中存在一个疑惑,这点我们一会儿来说明。思路:本题增加了一种冷冻期的量,引出一种全新的状态。我所理解的是本题增加了一个状态,是冷冻状态。思路:就是在 122.买卖股票的最佳时机II 中每次卖出股票时增加手续费的操作即可求解。现在给出三个状态:0表示不持有股票;
代码随想录算法训练营day54 || 123.买卖股票的最佳时机III,188.买卖股票的最佳时机IV 从中我们可以看到不持有状态的dp[i][0]总是依赖dp[i-1][1],同理dp[i][1]也是依赖dp[i-1][0]。(记住这一点,非常的重要!,如果还原,应该是dp[i-1][0][k-1]-prices[i],用来进入一次新的交易。
代码随想录算法训练营day53 || 121.买卖股票的最佳时机,122.买卖股票的最佳时机|| 思路:二维dp在递推公式上与 买卖股票的最佳时机I 有这不同,是dp[i-1][0]-prices[i]替代-prices[i]这个过程, 其实本质就是-prices[i]表示的dp[i-1][0]总是零,即模拟出了总是第一次买入,而没有其他买入所带来的收益。而去两题针对dp[i][1]取max都是喜欢买的价格尽可能的小或者减少利润的消耗。思路:寻找全局最大间隔,对于不满足后大前小的地方,直接继承前一位置的状态。
代码随想录算法训练营day53 || 198. 打家劫舍,213.打家劫舍II,337.打家劫舍 III 其实归根到底这么想,是因为打家劫舍系列的题目,i位置的状态迁移总是与i-1和i-2两个位置相关,i继承于i-2,i-1是i所参考对比的,那么在访问过程中,以及最后输出结果的时候,需要判别的就是dp[n] dp[n-1]两个位置;k]+nums[j] 这样统计。递推公式与 打家劫舍I 的公式一致,而遍历顺序上,可从数组的任一位置开始,因此我们可以选择从数组的0位置开始,并且注意特殊的nums.length-1位置是从0位置开始遍历时不可以再接触的一个位置。思路:树形结构的动态规划题目,本题不会,做不出来。