using System.Collections.Generic;
public static void Main()
int[] height = new int[]{1,8,6,2,5,4,8,3,7};
int result = Pointers.ContainerMostWater(height);
Console.WriteLine($"#container-with-most-water#\nMax area for the container with most water is {result}.\n");
int [] sortedNumbers = new int[]{2,7,11,15};
int [] twoSumSortedResult = Pointers.TwoSumIISorted(sortedNumbers, target);
Console.WriteLine($"#two-sum-ii-input-array-is-sorted#\nFor sorted input array, index {twoSumSortedResult[0]} and index {twoSumSortedResult[1]} sum up to {target}.\n");
int [] numbers3Sum = new int[]{-1,0,1,2,-1,-4};
IList<IList<int>> result3Sum = Pointers.ThreeSum(numbers3Sum);
Console.WriteLine("#3Sum#\nResult is: ");
foreach(var n in result3Sum)
for(int i = 0; i < n.Count; i++)
Console.Write($"{n[i]} ");
int lengthOfLongestSubstring = Pointers.LongestSubstringWithoutRepeatingCharacters(s);
Console.WriteLine($"#LongestSubstringWithoutRepeatingCharacters#\nLongest substring without repeating characters in {s} is {lengthOfLongestSubstring}\n");
int[] nums = new int[]{1,5,4,2,9,9,9};
long maxSumOfDistinctSubbarays = Pointers.MaxSumOfDistinctSubbarraysWithLengthK(nums,k);
Console.WriteLine($"#MaxSumOfDistinctSubbarraysWithLengthK#\nMaximum sum of distinct subbarrays with length K = {maxSumOfDistinctSubbarays}");
public static class Pointers
public static long MaxSumOfDistinctSubbarraysWithLengthK(int[] nums, int k)
HashSet<int> window = new();
for(int right = 0; right < nums.Length; right++)
while(window.Contains(nums[right]))
window.Remove(nums[left]);
currentSum -= nums[left];
currentSum += nums[right];
if(right - left + 1 == k)
maxSum = Math.Max(maxSum, currentSum);
window.Remove(nums[left]);
currentSum -= nums[left];
public static int LongestSubstringWithoutRepeatingCharacters(string s)
if(s.Length <= 1) return s.Length;
int longestSubstring = int.MinValue;
HashSet<char> temp = new();
for(int right = left; right < s.Length; right++)
while(temp.Contains(s[right]))
longestSubstring = Math.Max(longestSubstring, right - left + 1);
public static IList<IList<int>> ThreeSum(int[] nums)
IList<IList<int>> result = new List<IList<int>>();
for(int i = 0; i < nums.Length; i++)
if(i > 0 && nums[i] == nums[i - 1]) continue;
int left = i, right = nums.Length - 1;
int sum = nums[i] + nums[left] + nums[right];
else if(sum > 0) right--;
result.Add(new List<int>(){
nums[i], nums[left], nums[right]
while(left < right && nums[left] == nums[left - 1]) left++;
public static int[] TwoSumIISorted(int[] nums, int target)
int right = nums.Length - 1;
if(nums[left] + nums[right] < target) left++;
if(nums[left] + nums[right] > target) right--;
return new int[]{left + 1, right + 1};
public static int ContainerMostWater(int [] heights)
if(heights.Length == 1) return -1;
int right = heights.Length - 1;
int maxArea = int.MinValue;
int area = (right - left) * Math.Min(heights[left], heights[right]);
maxArea = Math.Max(maxArea, area);
if(heights[left] < heights[right])