刷题结束的学习心得 | 豆包MarsCode AI刷题

41 阅读3分钟

用一道题来解释: 给定一个整数数组a,定义一个子数组为“稳定的”,当且仅当该子数组中任意相邻两个元素之差的绝对值不超过1。任务是找到数组a中最长的“稳定的”连续子数组的长度。 解决的方案: 要解决这个问题,我们可以使用滑动窗口技术来追踪当前检查的子数组,并在遍历过程中更新最长稳定子数组的长度。这种方法的时间复杂度为O(n),其中n是数组的长度。 用代码来解释:

public class Main {
    public static int solution(int n, int[] a) {
        // 初始化最长稳定子数组的长度
        int maxLength = 0;
        
        // 遍历数组,寻找最长的稳定子数组
        for (int i = 0; i < n; i++) {
            // 初始化当前稳定子数组的长度
            int currentLength = 1;
            
            // 从当前元素开始,向后检查相邻元素的差值
            for (int j = i + 1; j < n; j++) {
                // 如果相邻元素的差值不超过1,增加当前稳定子数组的长度
                if (Math.abs(a[j] - a[j - 1]) <= 1) {
                    currentLength++;
                } else {
                    // 否则,跳出内层循环
                    break;
                }
            }
            
            // 更新最长稳定子数组的长度
            maxLength = Math.max(maxLength, currentLength);
        }
        
        return maxLength;
    }

    public static void main(String[] args) {
        System.out.println(solution(5, new int[]{2, 4, 2, 3, 2}) == 3);
        System.out.println(solution(6, new int[]{1, 2, 2, 3, 4, 1}) == 5);
        System.out.println(solution(7, new int[]{5, 5, 6, 7, 7, 6, 5}) == 7);
    }
}

学习心得

  1. 理解题意:首先需要准确理解题目要求,包括对“稳定”的定义和寻找最长稳定子数组的意义。
  2. 选择合适的数据结构和算法:对于这类涉及连续子数组的问题,滑动窗口是一个非常有效的工具。它允许我们以线性时间复杂度解决问题。
  3. 边界条件处理:考虑空数组或只有一个元素的情况,确保程序能够正确处理这些特殊情况。
  4. 代码简洁性:保持代码简洁易懂,有助于提高可维护性和可读性。例如,在上述解法中,通过简单的逻辑判断和变量更新即可完成任务。
  5. 性能优化:尽管本题已经使用了最优解法,但在其他情况下,可能还需要考虑更复杂的优化策略,如空间优化等。
  6. 测试用例的重要性:编写充分的测试用例可以帮助验证算法的正确性,发现潜在的错误点。特别是边缘情况和异常输入的处理。
  7. 抽象思维能力:这种类型的问题锻炼了将实际问题抽象成数学模型的能力,以及如何利用现有知识库中的概念(如滑动窗口)来解决问题。

通过这样的练习,不仅能够加深对特定算法的理解,还能提升面对新问题时快速分析并设计解决方案的能力。此外,这也有助于培养良好的编程习惯,比如写清晰的文档、注释以及进行单元测试,这些都是成为优秀程序员不可或缺的部分。