Skip to content

Commit

Permalink
Add Find Longest Subarray Sum Is Less Or Equal K Problem (#16)
Browse files Browse the repository at this point in the history
  • Loading branch information
xtenzQ authored Jul 5, 2024
1 parent 4eb8457 commit 5393eb3
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.xtenzq.arrays;

public class SlidingWindow {

/**
* Finds the length of the longest subarray with a sum less than or equal to a given value.
*
* @param nums the array of positive integers
* @param k the maximum allowed sum of the subarray
* @return the length of the longest subarray with a sum less than or equal to {@code k}
* @implNote This method runs in {@code O(n)} time complexity and {@code O(1)} space complexity,
* where {@code n} is the length of {@code nums}.
*/
public static int findLongestSubArraySumLessOrEqualK(int[] nums, int k) {
int left = 0, answer = 0, curr = 0;
for (int right = 0; right < nums.length; right++) {
curr += nums[right];
while (curr > k) {
curr -= nums[left];
left++;
}
answer = Math.max(answer, right - left + 1);
}
return answer;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.xtenzq.arrays;

import org.junit.jupiter.api.Test;

import static com.xtenzq.arrays.SlidingWindow.findLongestSubArraySumLessOrEqualK;
import static org.junit.jupiter.api.Assertions.*;

class SlidingWindowTest {

@Test
void testFindLongestSubArraySumLessOrEqualK_Example() {
int[] nums = {3, 2, 1, 3, 1, 1};
int k = 5;
assertEquals(3, findLongestSubArraySumLessOrEqualK(nums, k));
}

@Test
void testFindLongestSubArraySumLessOrEqualK_AllElementsLessThanK() {
int[] nums = {1, 2, 1, 2, 1};
int k = 5;
assertEquals(3, findLongestSubArraySumLessOrEqualK(nums, k));
}

@Test
void testFindLongestSubArraySumLessOrEqualK_SingleElementEqualsK() {
int[] nums = {5};
int k = 5;
assertEquals(1, findLongestSubArraySumLessOrEqualK(nums, k));
}

@Test
void testFindLongestSubArraySumLessOrEqualK_SingleElementGreaterThanK() {
int[] nums = {6};
int k = 5;
assertEquals(0, findLongestSubArraySumLessOrEqualK(nums, k));
}

@Test
void testFindLongestSubArraySumLessOrEqualK_MultipleSubarrays() {
int[] nums = {1, 2, 3, 4, 5};
int k = 5;
assertEquals(2, findLongestSubArraySumLessOrEqualK(nums, k));
}

@Test
void testFindLongestSubArraySumLessOrEqualK_EmptyArray() {
int[] nums = {};
int k = 5;
assertEquals(0, findLongestSubArraySumLessOrEqualK(nums, k));
}
}

0 comments on commit 5393eb3

Please # to comment.