2321. 拼接数组的最大分数
核心思想:数学思维。假设nums1的和为a0+a1+a2+a3+...an-1 = sum(nums1),nums2的和为b0+b1+b2+b3+...bn-1 = sum(nums2),交换al...ar与bl..br,现在nums1的和要最大,则s = sum(nums1) + (br-ar)+(br-1-ar-1)...(bl-al),所以你要使后面的值更大,交换后的结果才大,所以就变成了求最大连续数组的和。
768. 最多能完成排序的块 II
核心思想:这题其实有点贪心的思想。如果后面的块比前面的块大我们就尽可能的让它单独为一块。我们用栈来维护每个块的最大值。比如,arr = [2,1,3,4,4],首先[2]入栈,1入栈发现比2小,先把2值保存下来,继续弹出,发现栈为空了就把2放入,此时栈为[2],然后3,4,4,都大于等于前面的数,所以最后stack剩余[2,3,4,4],即4块。比如[1,1,2,1,1,3,4,5,1,6],1入栈[1],1入栈[1,1],2入栈[1,1,2],然后1入栈发现2比1大,先把2记录,剩余[1,1]然后继续比较发现没有比1小,然后把2放回
[1,1,2],同理下一个1也是一样,其实现在的分好的块是[1,1,2,1,1,3,4,5,1,6],只是栈里面只保留每一个块的最大值,然后又是3,4,5入栈[1,1,2,1,1,3,4,5,1,6],然后1入栈发现[1,1,2,3,4,5]比5小,然后先把5记录下来,剩余[1,1,2,3,4],然后比较发现1比234都小,然后把它们都拿出来,在把5放入,模拟的就是[1,1,2,1,1,3,4,5,1,6],2,1,1,3,4,5,1为1块的过程,最后6单独为1块。最后的栈为[1,1,5,6]四块。然后文字讲解可能不太清楚,大家可以自己模拟一下。核心思想就是维护每一块的最大值,当新加入的值比前一个块的最大值小的时候,它只能融合到这一个块中,如果分别比前2个块的最大值小的话,就只能把这两个块和它一起融合在一起,并弹出前1个块的最大值;同理如何比前三个块的分别的最大值小的话,就只能把这三个块和它一起融合在一起,并弹出前2个块的最大值。
2192. 有向无环图中一个节点的所有祖先
这题不附上核心思想了(理解还不够),题目官方给出了题解。