解答
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);
}
总结
使用滑动窗口的套路来解题。