剑指offer

04. 二维数组中的查找

最左下角开始找,一个数右边的数比当前数大,上边的数比当前数小,目标数比当前数大上移,比当前数小就右移

 

53 - II. 0~n-1中缺失的数字

mid>right,最小值一定在mid的右边,left=mid+1

mid<right,最小值一定是mid,或在mid的左边,right=mid

mid=left或mid=right,从right开始往左找最小值

 

50. 第一个只出现一次的字符

用LinkedHashMap

 

32.III. 从上到下打印二叉树 III

奇数层队列的值加到队列尾部,偶数层队列的值加到队列头部,奇数层反着加,偶数层正着加

 

26. 树的子结构

A和B的根节点相同的话直接进入比较

isSubStructureDfs(A,B)

A和B的根节点不相同看B是不是A的左子树或右子树的子结构

isSubStructure(A.left,B) || isSubStructure(A.right,B)

?    3
   /   4  5
 / 1  2



   4 
 /
1

1、isSub(3,4)  3不等于4 返回false,看B是不是A的左子树的子结构 isSub(3的左子树,4)

2、isSub(4,4),dfs(4,4),4等于4,进行下一层递归 dfs(4的左子树,4的左子树),即dfs(11),1等于1,进行下一层递归 dfs(1的左子树,1的左子树),即dfs(nullnull),B等于null返回true,进行下一层递归 dfs(1的右子树,1的右子树),即dfs(nullnull),B等于null返回true,isSub(4,4)这个递归返回true结束递归

 

 

10- I. 斐波那契数列

数组的长度要n+1,因为有第0项

 

63. 股票的最大利润

第i天最大利润=max(前i-1天的最大利润,当天价格-前i-1天的最低价格)

前i-1天的最大利润的利润只用一个变量maxProfit维护,不用数组

当天价格-前i-1天的最低价格大于maxProfit就更新maxProfit

前i-1天的最低价格只用一个变量minPrice维护,不用数组:

当天价格小于minPrice就更新minPrice

 

42. 连续子数组的最大和

以每个位置为终点的和最大子数组 都是基于其前一位置的和最大子数组计算得出

转移方程: 若 dp[i-1] ≤0 ,说明 dp[i - 1]对 dp[i] 产生负贡献,即 dp[i-1] + nums[i]不如 nums[i] 本身大。
?
当 dp[i - 1] > 0 时:执行 dp[i] = dp[i-1] + nums[i] ;
当 dp[i - 1] ≤0 时:执行 dp[i] = nums[i] ;

 

47. 礼物的最大价值

i=0,j !=0,dp[i][j]=grid[i][j]+dp[i][j-1]

i != 0,j  = 0,dp[i][j]=grid[i][j]+dp[i-1][j]

 i != 0,j  != 0,dp[i][j]=grid[i][j]+ max.(dp[i][j-1],dp[i-1][j])

 

 

46. 把数字翻译成字符串

 

剑指offer

上一篇:CF1391D-505 (思维结论 + 暴力 + 状压dp)


下一篇:leetcode 797. 所有可能的路径