这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战
最长和谐子序列
该题出自力扣的594题——最长和谐子序列(简单题),题解消化于评论区
审题
和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。
现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。
数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。
-
简单概括就是给一个数组,找出其中最大值和最小值的差为1 的子数组长度
-
方法很多,这边采用了类似双指针的方法去实现
- 先对数组排序,排序后可以采用双指针,否则就需要对每个数据进行比对
- 循环遍历数组,数组内再次指定指针while循环,找出是否存在两个元素之间差值为1
- 找到差值为1 的元素后,对结果集进行最大比较
编码
public static int findLHS(int[] nums) {
Arrays.sort(nums);
int target = 0;
int begin = 0;
for (int i = 0;i<nums.length;i++){
while (nums[i] - nums[begin] > 1){
begin++;
}
if (nums[i] - nums[begin] == 1){
target = Math.max(target,i-begin+1);
}
}
return target;
}
最大子序和
该题出自力扣的53题——最大子序和(简单题),题解消化于评论区
审题
给定一个整数数组
nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
-
清晰明了的题目,就是找到子数组的最大和
-
该题只需要找到相关的规律即可,无需过度关注子数组的本身
- 如果相加的总数 = 负数,那么就需要重新定义起始值
- 当前总值与res取最大值
编码
该解法最为巧妙之处就在于忽略了子序列的查找对比,利用规律找到答案,对于最大子序列来说,从头到尾都是正数是最大的,只需要找到和的最大值,当和的值为负数时,就证明后续序列已经不再是最大的子序列和了,需要重新定义序列的首值
public static int maxSubArray(int[] nums) {
//数组nums
int sum = nums[0];
int res = 0;
for (int num :
nums) {
if (sum > 0){
sum += num;
}else {
sum = num;
}
res = Math.max(res,sum);
}
return res;
}