实习四十天被抓了,不回去就开除。。。

科技   2024-11-26 10:10   上海  

精品推荐

《征服数据结构》专栏:50多种数据结构彻底征服

《经典图论算法》专栏:50多种经典图论算法全部掌握


之前有一位网友说找到了工作,学校不让去实习,可以看下《好不容易找到的工作,学校不让去实习》,我本来以为偷偷跑出去会没事的,结果另一位网友因为偷偷跑出去实习40天,被导员发现了,要求第二天必须回去,不回去就开除,连离职的时间都不给。现在大学都这样吗,为啥不允许学生实习。




--------------下面是今天的算法题--------------


来看下今天的算法题,这题是LeetCode的第413题:等差数列划分。


问题描述



来源:LeetCode第413题
难度:中等

如果一个数列至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。


给你一个整数数组 nums ,返回数组 nums 中所有为等差数组的子数组个数。子数组是数组中的一个连续序列。


示例1:

输入:nums = [1,2,3,4]

输出:3

解释:nums 中有三个子等差数组:[1, 2, 3]、[2, 3, 4] 和 [1,2,3,4] 自身。

示例2:

输入:nums = [1]

输出:0


  • 1 <= nums.length <= 5000

  • -1000 <= nums[i] <= 1000


问题分析



按照题的要求当数组的长度小于3的时候是不能构成等差数列的。如果数组长度小于3,我们直接返回0。


定义一维数组dp,其中dp[i]表示以nums[i]为等差数列最后一个元素的等差数列个数。很明显如果nums[i]可以和前面的数字可以构成等差数列,那么dp[i]=dp[i-1]+1,如下图所示

如果nums[i]和前面的数字不能构成等差数列,那么dp[i]肯定是等于0的,我们还需要重新计算新的等差值diff。统计的时候只需要把所有等差数列的个数相加即可。

JAVA:
public int numberOfArithmeticSlices(int[] nums) {
    int len = nums.length;
    if (len < 3)// 如果构不成等差数列,返回0
        return 0;
    int[] dp = new int[len];
    int count = 0;// 等差数列的个数
    // 等差数列的差值
    int diff = nums[1] - nums[0];
    for (int i = 2; i < len; i++) {
        if (nums[i] - nums[i - 1] == diff) {
            // 如果当前数字和前面的可以构成等差数列,
            // 就更新dp和count的值
            dp[i] = dp[i - 1] + 1;
            count += dp[i];
        } else {
            // 如果不能和前面的构成等差数列,要重新计算diff
            diff = nums[i] - nums[i - 1];
        }
    }
    return count;
}

C++:
public:
    int numberOfArithmeticSlices(vector<int> &nums) {
        int len = nums.size();
        if (len < 3)// 如果构不成等差数列,返回0
            return 0;
        vector<intdp(len, 0);
        int count = 0;// 等差数列的个数
        // 等差数列的差值
        int diff = nums[1] - nums[0];
        for (int i = 2; i < len; i++) {
            if (nums[i] - nums[i - 1] == diff) {
                // 如果当前数字和前面的可以构成等差数列,
                // 就更新dp和count的值
                dp[i] = dp[i - 1] + 1;
                count += dp[i];
            } else {
                // 如果不能和前面的构成等差数列,要重新计算diff
                diff = nums[i] - nums[i - 1];
            }
        }
        return count;
    }

Python:
def numberOfArithmeticSlices(self, nums: List[int]) -> int:
    length = len(nums)
    if length < 3:  # 如果构不成等差数列,返回0
        return 0
    dp = [0] * length
    count = 0  # 等差数列的个数
    diff = nums[1] - nums[0]  # 等差数列的差值
    for i in range(2, length):
        if nums[i] - nums[i - 1] == diff:
            # 如果当前数字和前面的可以构成等差数列,
            # 就更新dp和count的值
            dp[i] = dp[i - 1] + 1
            count += dp[i]
        else:
            # 如果不能和前面的构成等差数列,要重新计算diff
            diff = nums[i] - nums[i - 1]
    return count


笔者简介
博哥,真名:王一博,毕业十多年,《算法秘籍》作者,专注于数据结构和算法的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以下载我整理的1000多页的PDF算法文档

《征服数据结构》专栏

《征服数据结构》数组

《征服数据结构》稀疏表(Sparse Table)

《征服数据结构》单向链表

《征服数据结构》双向链表

《征服数据结构》块状链表

《征服数据结构》跳表

《征服数据结构》队列和循环队列

《征服数据结构》双端队列

《征服数据结构》单调队列

《征服数据结构》栈

《征服数据结构》单调栈

《征服数据结构》双端栈

《征服数据结构》散列表

《征服数据结构》堆

《征服数据结构》字典树(Trie树)

《征服数据结构》ArrayMap

《征服数据结构》SparseArray

《征服数据结构》二叉树

《征服数据结构》二叉搜索树(BST)

《征服数据结构》笛卡尔树

《征服数据结构》AVL树

《征服数据结构》树堆(Treap)

《征服数据结构》FHQ-Treap

《征服数据结构》哈夫曼树

《征服数据结构》Splay 树

《征服数据结构》Splay 树(二)

《征服数据结构》滚动数组

《征服数据结构》差分数组

《征服数据结构》并查集(DSU)

《征服数据结构》LRU缓存

《征服数据结构》LFU缓存

《征服数据结构》替罪羊树

……


《经典图论算法》专栏

《经典图论算法》图的介绍

《经典图论算法》图的表示方式

《经典图论算法》邻接矩阵转换

《经典图论算法》广度优先搜索(BFS)

《经典图论算法》深度优先搜索(DFS)

《经典图论算法》A*搜索算法

《经典图论算法》迭代深化深度优先搜索(IDDFS)

《经典图论算法》IDA*算法

《经典图论算法》双向广度优先搜索

《经典图论算法》迪杰斯特拉算法(Dijkstra)

《经典图论算法》贝尔曼-福特算法(Bellman-Ford)

《经典图论算法》SPFA算法

《经典图论算法》弗洛伊德算法(Floyd)

《经典图论算法》卡恩(Kahn)算法

《经典图论算法》基于DFS的拓扑排序

《经典图论算法》约翰逊算法(Johnson)

《经典图论算法》普里姆算法(Prim)

《经典图论算法》克鲁斯卡尔算法(Kruskal)

《经典图论算法》博鲁夫卡算法(Boruvka)

《经典图论算法》Flood fill算法

……


数据结构和算法
王一博,《算法秘籍》作者,1000多页的pdf算法题我也已经整理完成,在公众号“数据结构和算法”中回复关键字“pdf”即可下载。
 最新文章