Approach
Sorting and greedy selection
For Make Lexicographically Smallest Array by Swapping Elements, the implementation first exposes a useful order, then scans that order while making locally justified choices.
- Choose the key that reveals the greedy or grouping structure.
- Sort the relevant records by that key.
- Scan in order, maintaining the invariant that makes each local choice safe.
Code notes
- 44 lines of Java from the credited upstream file 2948.java.
- The implementation visibly relies on sequence storage.
- 5 loop blocks detected.
Complexity
Sorting is typically the dominant term unless the subsequent scan uses a more expensive nested operation.
Check the problem constraints before deciding whether this complexity will pass.
Use this to learn the idea, then write your own version.
1class Solution {2 public int[] lexicographicallySmallestArray(int[] nums, int limit) {3 int[] ans = new int[nums.length];4 List<List<Pair<Integer, Integer>>> numAndIndexesGroups = new ArrayList<>();5 6 for (Pair<Integer, Integer> numAndIndex : getNumAndIndexes(nums))7 if (numAndIndexesGroups.isEmpty() ||8 numAndIndex.getKey() -9 numAndIndexesGroups.get(numAndIndexesGroups.size() - 1)10 .get(numAndIndexesGroups.get(numAndIndexesGroups.size() - 1).size() - 1)11 .getKey() >12 limit) {13 14 numAndIndexesGroups.add(new ArrayList<>(List.of(numAndIndex)));15 } else {16 17 numAndIndexesGroups.get(numAndIndexesGroups.size() - 1).add(numAndIndex);18 }19 20 for (List<Pair<Integer, Integer>> numAndIndexesGroup : numAndIndexesGroups) {21 List<Integer> sortedNums = new ArrayList<>();22 List<Integer> sortedIndices = new ArrayList<>();23 for (Pair<Integer, Integer> pair : numAndIndexesGroup) {24 sortedNums.add(pair.getKey());25 sortedIndices.add(pair.getValue());26 }27 sortedIndices.sort(null);28 for (int i = 0; i < sortedNums.size(); ++i) {29 ans[sortedIndices.get(i)] = sortedNums.get(i);30 }31 }32 33 return ans;34 }35 36 private Pair<Integer, Integer>[] getNumAndIndexes(int[] nums) {37 Pair<Integer, Integer>[] numAndIndexes = new Pair[nums.length];38 for (int i = 0; i < nums.length; ++i)39 numAndIndexes[i] = new Pair<>(nums[i], i);40 Arrays.sort(numAndIndexes, Comparator.comparingInt(Pair::getKey));41 return numAndIndexes;42 }43}44