angela 发布的文章

1191 K-Concatenation Maximum Sum K 次串联后最大子数组之和

Description:
Given an integer array arr and an integer k, modify the array by repeating it k times.

For example, if arr = [1, 2] and k = 3 then the modified array will be [1, 2, 1, 2, 1, 2].

Return the maximum sub-array sum in the modified array. Note that the length of the sub-array can be 0 and its sum in that case is 0.

As the answer can be very large, return the answer modulo 109 + 7.

Example:

Example 1:

Input: arr = [1,2], k = 3
Output: 9

Example 2:

Input: arr = [1,-2,1], k = 5
Output: 2

Example 3:

Input: arr = [-1,-2], k = 7
Output: 0

Constraints:

1 <= arr.length <= 10^5
1 <= k <= 10^5
-10^4 <= arr[i] <= 10^4

题目描述:
给定一个整数数组 arr 和一个整数 k ,通过重复 k 次来修改数组。

例如,如果 arr = [1, 2] , k = 3 ,那么修改后的数组将是 [1, 2, 1, 2, 1, 2] 。

返回修改后的数组中的最大的子数组之和。注意,子数组长度可以是 0,在这种情况下它的总和也是 0。

由于 结果可能会很大,需要返回的 109 + 7 的 模 。

示例 :

示例 1:

输入:arr = [1,2], k = 3
输出:9

示例 2:

输入:arr = [1,-2,1], k = 5
输出:2

示例 3:

输入:arr = [-1,-2], k = 7
输出:0

提示:

1 <= arr.length <= 10^5
1 <= k <= 10^5
-10^4 <= arr[i] <= 10^4

思路:

模拟
当 k = 1 时, 转化为最大连续子数组和, 注意答案非负
当 k = 2 时, 为数组最大前缀和和最大后缀和的和
当 k > 2 时, 如果数组的和为正, 需要加上 sum * (k - 2)
时间复杂度为 O(n), 空间复杂度为 O(n)

代码:
C++:

class Solution 
{
public:
    int kConcatenationMaxSum(vector<int>& arr, int k) 
    {
        int n = arr.size(), pre = 0, result = 0, mod = 1e9 + 7, sum = 0;
        for (int i = 0; i < (n << 1); i++) 
        {
            pre = max(arr[i % n], pre + arr[i % n]);
            result = max(result, pre);
            if (k == 1 and i == n - 1) return result;
            if (i < n) sum += arr[i];
        }
        return (int)((max(0, sum) * (long)(k - 2) + result) % mod);
    }
};

Java:

class Solution {
    public int kConcatenationMaxSum(int[] arr, int k) {
        int n = arr.length, pre = 0, result = 0, mod = 1_000_000_007, sum = 0;
        for (int i = 0; i < (n << 1); i++) {
            pre = Math.max(arr[i % n], pre + arr[i % n]);
            result = Math.max(result, pre);
            if (k == 1 && i == n - 1) return result;
            if (i < n) sum += arr[i];
        }
        return (int)((Math.max(0, sum) * (long)(k - 2) + result) % mod);
    }
}

Python:

class Solution:
    def kConcatenationMaxSum(self, arr: List[int], k: int) -> int:
        result, pre, s, mod = 0, 0, sum(arr), 10 ** 9 + 7
        arr *= min(k, 2)
        for i, v in enumerate(arr):
            result = max(result, (pre := max(v, v + pre)))
        return (max(result, s * (k - 2) + result) if (s > 0 and k > 2) else result) % mod

原文链接:https://www.jianshu.com/p/dc666ae89f2e

续70同学的《Its about time》,尝试阐述一下typecho的简洁哲学,希望能从下面三点让大家了解我们作为一个小团队,是如何设计程序架构、用户界面及取舍各种需求的,不足之处请多多指教。

安静的容器

快节奏的生活里总是有很多酸甜苦辣,五味杂陈,我们用文字、图片、音频在博客上记录下这些精彩或不精彩的片段,分享给所有能看到的人并希望能获得反馈。typecho想提供这样一个产品,它如同安静的玻璃瓶,简简单单,没有什么花巧的装饰。撰写者只需要考虑往容器里放什么,而不是怎么放;容器能忠实呈现给读者的,是撰写者独一无二的生活,而不是容器自己。

所以, typecho的前后端界面设计,都是趋向简约的,不吵闹的,我们追求“刚刚好”,我们想让typecho就是一张白纸,也许有些质感,但重要的是你用什么色彩在书写,这白色不会成为干扰,而会让这些色彩更凸显。

有限的需求满足

typecho不是我们的全部,时间精力的限制,不允许所有的需求都被满足。我们持有这样的观点:只针对有限的需求去开发有限的功能,并让这些功能表现卓越。所以typecho可能缺少一些你偶尔会用到的功能,但是你经常使用的部分,它一定就在那里,而且会给你惊喜。我们在开发的讨论中也提出开发各种新奇的特性,实验各种领先的技术,但大部分都不会运用到typecho。欲望需要收敛,因为现有功能都不够完美。

收敛的需求也带来负面的影响,typecho不是一款能兼容所有环境的程序,它常常在rewrite或其他方面有一些瑕疵,这方面wordpress做得更棒。

需求的有限满足

经常有用户说需要编辑器、需要友情链接管理、需要置顶日志或其他什么功能,这些都可以通过插件来变通实现。实际上很多易用性问题,我们都寄希望于第三方开发来完善,这也是官方文档建设再次被提上日程并承诺重视的原因,开放会带来期待中的多样性,造就一个有趣的小生态系统。typecho只能有限满足一部分用户对博客程序的要求,可预见的未来里,它也不会是一个CMS。

选择权在用户手中,如果你需要一个简洁的博客程序,typecho就在这里。

标签:none

是的,你没有看错,经过漫长的等待,我们终于发布了 Typecho 1.2.0 正式版。这个版本的开发经历了如此长的时间,以至于我无法一次性列出这么长的详细改进列表。

除了修复了很多bug以外,我们重要的改进有如下几点:

  1. 新的编辑器实时预览自动跟随效果,以及主题内预览功能
  2. 后台界面对移动端的适配
  3. 新的安装程序
  4. 进入 PHP 7.2 时代,以及对 PHP 8 的更好支持
  5. 对容器化的更好支持

除了新功能,大家也可以发现我们的版本号规则有变化。新的版本号会采用常规的3组数字组成,比如1.2.0。它适合小步快跑的开发模式,具体的解释可以看这篇文章。

这个小小的软件记录了我们很多人生命中最美好的时光,大家用它在缤纷多彩的互联网上留下自己的印记。快乐,伤痛,成长,迷惘,时间无情地流过,我们却让它有了意义。这时我们再回头来看 Typecho 的名称组成:轻击键盘,静候回音。在你写下文字的时候,涟漪已然产生。

而于我来说,十多年前键盘敲下的第一行代码,也不知不觉产生了这么大的回响。在这春回大地之际,感怀之余,未免又对未来心生希望起来。让我们大声宣布,Typecho 回来了!

随着typecho用户越来越多,大家对个性化的需求也越来越强,其实typecho自身有很多自定义的功能,受于文档缺乏的限制一直不为大家发现,现在我在这里给大家略说一二

我在哪?

这是一个非常常用的功能,简单来说就是告诉模板现在是哪个页面,这样我们在模板里就可以用简单的判断语句来实现特殊效果。typecho已经内置了强大的is方法来供大家判断当前页面。

比如,我想在进入文章页面时,在右侧边栏中显示一段广告代码,我们就可以这么写

is('post')): ?> 我的广告来了

如果我想在某一则页面,比如说about页面显示时,让它显示一段广告代码,那么可以这么写

is('page', 'about')): ?> 我的广告来了

那么,有哪些页面是可以供判断的呢,答案是所有的页面,他们的参数如下

  1. index:第一个参数设为index,可以判断当前页是否为主页
  2. archive:第一个参数设为archive,可以判断当前页是否为文章归档页,比主页,分类文章页,标签文章页,日期归档文章页
  3. category:第一个参数设为category,可以判断当前页是否为分类文章页,第二个参数传入具体分类slug name,比如default等等,就可以判断具体是哪个分类
  4. tag:第一个参数设为tag,可以判断当前页是否为标签文章页,第二个参数传入具体标签slug name,比如typecho等等,就可以判断具体是哪个标签
  5. date:第一个参数设为date,可以判断当前页是否为日期归档文章页,第二个参数传入year,month或者day,就可以判断是否为按年,按月还是按日归档
  6. single:第一个参数设为single,可以判断当前页是否为内容页,比如文章页,独立页面,附件显示页
  7. post:第一个参数设为post,可以判断当前页是否为内容页,第二个参数传入文章id,就可以判断具体是哪篇文章
  8. page:第一个参数设为page,可以判断当前页是否为独立页面,第二个参数传入页面slug name比如about,就可以判断具体是哪则独立页面
  9. attachment:第一个参数设为attachment,可以判断当前页是否为附件,第二个参数传入附件id,就可以判断具体是哪个附件

细心的朋友可能已经看出,上面的判断有明显的层次之分,他们从上到下互相包含,这样做有什么作用呢,下一次继续与大家分享typecho强大的模板结构.