1027. Longest Arithmetic Subsequence

题目文本会按所选界面语言从俄语翻译;代码保持不变。

Если задан 数组 nums целых чисел, return длину самой длинной арифметической подпоследовательности в nums. Примечание: subsequence - это 数组, который может быть получен из другого 数组а путем удаления некоторых или ни одного elementа без изменения порядка оставшихся elementов. Последовательность seq является арифметической, если seq[i + 1] - seq[i] имеют одинаковое значение (для 0 <= i < seq.length - 1).

示例:

Input: nums = [3,6,9,12]

Output: 4

C# 解法

匹配/原始
public class Solution {
    public int LongestArithSeqLength(int[] nums) {
        if (nums.Length == 0) return 0;
        
        var dp = new Dictionary<int, int>[nums.Length];
        for (int i = 0; i < nums.Length; i++) {
            dp[i] = new Dictionary<int, int>();
        }
        int maxLength = 0;
        
        for (int i = 0; i < nums.Length; i++) {
            for (int j = 0; j < i; j++) {
                int diff = nums[i] - nums[j];
                if (dp[j].TryGetValue(diff, out int length)) {
                    dp[i][diff] = length + 1;
                } else {
                    dp[i][diff] = 2;
                }
                maxLength = Math.Max(maxLength, dp[i][diff]);
            }
        }
        
        return maxLength;
    }
}

C++ 解法

自动草稿,提交前请检查
#include <bits/stdc++.h>
using namespace std;

// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
    public int LongestArithSeqLength(vector<int>& nums) {
        if (nums.size() == 0) return 0;
        
        var dp = new unordered_map<int, int>[nums.size()];
        for (int i = 0; i < nums.size(); i++) {
            dp[i] = new unordered_map<int, int>();
        }
        int maxLength = 0;
        
        for (int i = 0; i < nums.size(); i++) {
            for (int j = 0; j < i; j++) {
                int diff = nums[i] - nums[j];
                if (dp[j].TryGetValue(diff, out int length)) {
                    dp[i][diff] = length + 1;
                } else {
                    dp[i][diff] = 2;
                }
                maxLength = max(maxLength, dp[i][diff]);
            }
        }
        
        return maxLength;
    }
}

Java 解法

匹配/原始
public class Solution {
    public int longestArithSeqLength(int[] nums) {
        if (nums.length == 0) return 0;
        
        int n = nums.length;
        Map<Integer, Integer>[] dp = new HashMap[n];
        for (int i = 0; i < n; i++) {
            dp[i] = new HashMap<>();
        }
        int maxLength = 0;
        
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < i; j++) {
                int diff = nums[i] - nums[j];
                int length = dp[j].getOrDefault(diff, 1) + 1;
                dp[i].put(diff, length);
                maxLength = Math.max(maxLength, length);
            }
        }
        
        return maxLength;
    }
}

JavaScript 解法

匹配/原始
class Solution {
    longestArithSeqLength(nums) {
        if (nums.length === 0) return 0;
        
        const dp = Array(nums.length).fill(0).map(() => new Map());
        let maxLength = 0;
        
        for (let i = 0; i < nums.length; i++) {
            for (let j = 0; j < i; j++) {
                const diff = nums[i] - nums[j];
                const length = (dp[j].get(diff) || 1) + 1;
                dp[i].set(diff, length);
                maxLength = Math.max(maxLength, length);
            }
        }
        
        return maxLength;
    }
}

Algorithm

Инициализация переменных:

Создайте 数组 словарей dp, где dp[i][d] будет хранить длину самой длинной арифметической подпоследовательности, заканчивающейся на elementе i с разностью d.

Заполнение 数组а dp:

Пройдитесь по каждому elementу 数组а nums.

Для каждого elementа nums[j] (где j идет от 0 до i-1), вычислите разность d = nums[i] - nums[j].

Обновите dp[i][d] на основе значения dp[j][d].

Поиск максимальной длины:

Пройдите по 数组у dp и find максимальное значение среди всех значений dp[i][d].

😎

Vacancies for this task

活跃职位 with overlapping task tags are 已显示.

所有职位
目前还没有活跃职位。