题目描述
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
一、动态规划求解
当前的元素arr[i]能否构成最长定差子序列,是由上一个元素arr[i]-difference所能构成的最长定差子序列的长度决定的,故有:
len(arr[i]) = len(arr[i] - difference)+1
据此式,代码如下:
class Solution {
public int longestSubsequence(int[] arr, int difference) {
// 第一个值为当前最长子序列的最后一个元素,第二个值为当前最长子序列元素的个数
HashMap <Integer, Integer>map = new HashMap<>();
int max = 0;
for(int i = 0; i < arr.length; i++){
map.put(arr[i], map.getOrDefault(arr[i] - difference, 0) + 1);
max = Math.max(map.get(arr[i]), max);
}
return max;
}
}
二、一个笨方法:双循环遍历
另一种方法就是循环找出所有满足要求的子序列,取其中最长的。这里用到了双重循环,代码如下:
class Solution {
public int longestSubsequence(int[] arr, int difference) {
List<Integer> max=new ArrayList<Integer>();
for(int i=0;i<arr.length-1;i++){
int t = arr[i];
List<Integer> list=new ArrayList<Integer>();
list.add(t);
for(int j = i+1;j<arr.length;j++){
if(arr[j]-t == difference){
list.add(arr[j]);
t = arr[j];
}
}
if(max == null){
max = list;
}
else{
if(max.size() < list.size()){
max.clear();
max.addAll(list);
}
}
if(max.size()>arr.length-i) return max.size();
}
return max.size();
}
}
这种方法在LeetCode中提交时超出了时间限制。
总结
动态优化问题。