package com.fishercoder.solutions; import java.util.ArrayList; import java.util.List; import java.util.TreeMap; public class _881 { public static class Solution1 { public int numRescueBoats(int[] people, int limit) { TreeMap<Integer, Integer> map = new TreeMap<>(); for (int w : people) { map.put(w, map.getOrDefault(w, 0) + 1); } int boats = 0; List<Integer> uniqWeights = new ArrayList(map.keySet()); int left = 0; int right = uniqWeights.size() - 1; while (left < right) { int heavierWeight = uniqWeights.get(right); int lighterWeight = uniqWeights.get(left); if (heavierWeight + lighterWeight <= limit) { int pairs = Math.min(map.get(heavierWeight), map.get(lighterWeight)); boats += pairs; if (map.get(heavierWeight) == pairs && map.get(lighterWeight) == pairs) { map.remove(heavierWeight); map.remove(lighterWeight); left++; right--; } else if (map.get(heavierWeight) == pairs) { map.remove(heavierWeight); map.put(lighterWeight, map.get(lighterWeight) - pairs); right--; } else { map.remove(lighterWeight); map.put(heavierWeight, map.get(heavierWeight) - pairs); left++; } } else { boats += map.get(heavierWeight); map.remove(heavierWeight); right--; } } if (!map.isEmpty()) { int weight = uniqWeights.get(left); int remainingPeople = map.get(weight); if (remainingPeople == 1) { boats++; } else { if (weight * 2 <= limit) { boats += (remainingPeople / 2 + ((remainingPeople % 2 == 0) ? 0 : 1)); } else { boats += remainingPeople; } } } return boats; } } }