1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| public int getDistinctSubarray(int[] nums, int k) { if (nums == null || nums.length == 0) { return 0; } int left = 0, right = 0, oddCount = 0; Set<String> set = new HashSet<>(); StringBuilder sb = new StringBuilder(); while (right < nums.length) { oddCount += nums[right] % 2 == 1 ? 1 : 0; while (oddCount > k) { if (nums[left] % 2 == 1) { oddCount--; } left++; sb.delete(0, sb.indexOf(",") + 1); } sb.append(nums[right]); sb.append(','); updateSet(set, sb); right++; } return set.size(); } private void updateSet(Set<String> set, StringBuilder sb) { int start = 0, end = sb.indexOf(","); while (end > 0) { set.add(sb.substring(start, sb.length())); start = end + 1; end = sb.indexOf(",", start); } }
public int getDistinctSubarray2(int[] nums, int k) { if (nums == null || nums.length == 0) { return 0; } int left = 0, right = 0, oddCount = 0; Set<String> set = new LinkedHashSet<>(); Set<String> prevSet = new LinkedHashSet<>(); prevSet.add(""); while (right < nums.length) { oddCount += nums[right] % 2 == 1 ? 1 : 0; while (oddCount > k) { if (nums[left] % 2 == 1) { oddCount--; } List<String> prevSetList = new ArrayList<>(prevSet); for (int i = prevSetList.size() - 1; i >= 0 && prevSetList.get(i).startsWith(String.valueOf(nums[left])); i--) { prevSet.remove(prevSetList.get(i)); } left++; } prevSet = updateSet2(set, prevSet, nums[right]); right++; } return set.size(); } private Set<String> updateSet2(Set<String> set, Set<String> prevSet, int num) { Set<String> newSet = new LinkedHashSet<>(); newSet.add(""); for (String prev : prevSet) { String curr = prev + num + ","; if (!set.contains(curr)) { set.add(curr); newSet.add(curr); } } return newSet; }
|