LeetCode第1695题 - 删除子数组的最大得分

题目

解答

java 复制代码
class Solution {
	public int maximumUniqueSubarray(int[] nums) {
		int left = 0, right = 0;

		int result = Integer.MIN_VALUE;
		int sum = 0;

		Set<Integer> set = new HashSet<>();
		while (right < nums.length) {
			int v1 = nums[right];

			if (set.add(v1)) {
				++right;
				sum += v1;

				continue;
			}

			result = Math.max(result, sum);

			if (left < nums.length) {
				set.remove(nums[left]);
				sum -= nums[left];
				++left;
			}
		}

		result = Math.max(result, sum);

		return result;
	}
}

测试用例

java 复制代码
	@Test
	public void test001() {
		int result = s.maximumUniqueSubarray(new int[]{4, 2, 4, 5, 6});
		int expected = 17;
		Assert.assertTrue(String.valueOf(result), result == expected);
	}

	@Test
	public void test002() {
		int result = s.maximumUniqueSubarray(new int[]{5, 2, 1, 2, 5, 2, 1, 2, 5});
		int expected = 8;
		Assert.assertTrue(String.valueOf(result), result == expected);
	}

	@Test
	public void test003() {
		int result = s.maximumUniqueSubarray(new int[]{2, 4, 5, 6});
		int expected = 17;
		Assert.assertTrue(String.valueOf(result), result == expected);
	}

	@Test
	public void test004() {
		int result = s.maximumUniqueSubarray(new int[]{4, 2, 5, 6});
		int expected = 17;
		Assert.assertTrue(String.valueOf(result), result == expected);
	}

	@Test
	public void test005() {
		int result = s.maximumUniqueSubarray(new int[]{4});
		int expected = 4;
		Assert.assertTrue(String.valueOf(result), result == expected);
	}

	@Test
	public void test006() {
		int result = s.maximumUniqueSubarray(new int[]{4, 5});
		int expected = 9;
		Assert.assertTrue(String.valueOf(result), result == expected);
	}

	@Test
	public void test007() {
		int result = s.maximumUniqueSubarray(new int[]{4, 4});
		int expected = 4;
		Assert.assertTrue(String.valueOf(result), result == expected);
	}

总结

使用滑动窗口的套路来解题。