绝对差不超过限制的最长连续子数组
* 给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。
如果不存在满足条件的子数组,则返回 0 。
示例 1:
输入:nums = [8,2,4,7], limit = 4
输出:2
解释:所有子数组如下:
[8] 最大绝对差 |8-8| = 0 <= 4.
[8,2] 最大绝对差 |8-2| = 6 > 4.
[8,2,4] 最大绝对差 |8-2| = 6 > 4.
[8,2,4,7] 最大绝对差 |8-2| = 6 > 4.
[2] 最大绝对差 |2-2| = 0 <= 4.
[2,4] 最大绝对差 |2-4| = 2 <= 4.
[2,4,7] 最大绝对差 |2-7| = 5 > 4.
[4] 最大绝对差 |4-4| = 0 <= 4.
[4,7] 最大绝对差 |4-7| = 3 <= 4.
[7] 最大绝对差 |7-7| = 0 <= 4.
因此,满足题意的最长子数组的长度为 2 。
示例 2:
输入:nums = [10,1,2,4,7,2], limit = 5
输出:4
解释:满足题意的最长子数组是 [2,4,7,2],其最大绝对差 |2-7| = 5 <= 5 。
示例 3:
输入:nums = [4,2,2,2,4,4,2,2], limit = 0
输出:3
提示:
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^9
0 <= limit <= 10^9
特别low的思想,就是利用String求代码:
个人认为:子串利用String求解不管任何类型简单易操作
子序列问题使用双层循环解决问题,或者递归也可,只要把握这两两点问题大概能解出来,不过就是有点low
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class code_26_LongestContinuousSubarrayWithAbsoluteDiffLessThanOrEqualTolimit { public static void main(String[] args) { // String string = "123"; // char[] jude_array = string.toCharArray(); // for (int i = 0; i < jude_array.length; i++) { // System.out.println(jude_array[i]); // } } public static int longestSubarray(int[] nums, int limit) { StringBuilder str = new StringBuilder(); for (int i = 0; i < nums.length; i++) { str.append(nums[i]); } String value = str.toString(); List<String> list = getAllSubstrings(value); List<Integer> list2 = new ArrayList<>(); for (int i = 0; i < nums.length; i++) { boolean flag = get_jude(list.get(i),limit); if (flag) { list2.add(list.get(i).length()); } } Collections.sort(list2); return list2.get(list2.size() - 1); } public static List<String> getAllSubstrings(String s){ List<String> arrayList = new ArrayList<String>(); for (int i = 0; i < s.length() ; i++) { for (int j = i+1; j < s.length()+1 ; j++) { arrayList.add(s.substring(i, j)); } } return arrayList; } /* * 判断array里面最小值于最大值的差是不是小于一个数 * */ public static Boolean get_jude(String str , int limit){ char[] jude_array = str.toCharArray(); List<Character> characters = new ArrayList<>(); for (int i = 0; i < jude_array.length; i++) { characters.add(jude_array[i]); } Collections.sort(characters); if(Math.abs(Integer.parseInt(characters.get(0) + "") - Integer.parseInt(characters.get(characters.size() -1)+"")) <= limit){ return true; } return false; } }
或者利用简单的滑动窗口解决,其实可以这样理解但凡涉及到数组求两个值之间的关系,就可以使用滑动窗口,而滑动窗口的模板又是固定的
大概就是这样的:
left ,right = 0 while(right <= array.size){ 进行主逻辑,也就是建立left与right之间的关系即可 最后对right进行向右移动一定距离的操作 }
这里我使用python解决如上问题:
class Solution:
def longestSubarray(nums, limit):
from sortedcontainers import SortedList
s = SortedList()
left, right = 0, 0
res = 0
while right < len(nums):
s.add(nums[right]) # 不断的向排好序的sort里面田间数据
while s[-1] - s[0] > limit: # 最大值与最小值之间的差距是不是大于limlt,如果大于就移除掉curr里面最左边的元素
s.remove(nums[left])
left += 1 # 左边向右边移动一个单元
res = max(res, right - left + 1) # 当在curr里面del掉最左边的元素的时候就会和最大长度的进行比较,并更新最大值的数据
right += 1 # 右边的指针加一
return res