LC.P1488[避免洪水泛滥]
LC.P1488[避免洪水泛滥]
方法一:贪心+哈希表+有序集合12345678910111213141516171819202122232425class Solution { public int[] avoidFlood(int[] rains) { int n = rains.length; int[] ans = new int[n]; Arrays.fill(ans, -1); TreeSet<Integer> sunny = new TreeSet<>(); Map<Integer, Integer> rainy = new HashMap<>(); for (int i = 0; i < n; ++i) { int k = rains[i]; if (k > 0) { if (rainy.containsKey ...
LC.P1201[丑数III]
LC.P1201[丑数III]
方法一:容斥原理+二分12345678910111213141516171819202122class Solution { public int nthUglyNumber(int n, int a, int b, int c) { long ab = lcm(a, b), ac = lcm(a, c), bc = lcm(b, c), abc = lcm(a, lcm(b, c)); long left = 0, right = (long) Math.min(a, Math.min(b, c)) * n; while (left < right) { long mid = left + right >> 1; if (mid / a + mid / b + mid / c - mid / ab - mid / ac - mid / bc + mid / abc >= n) right = mid; ...
LC.P878[第N个神奇数字]
LC.P878[第N个神奇数字]
方法一:容斥原理+二分123456789101112131415161718192021class Solution { private static final int MOD = (int) 1e9 + 7; public int nthMagicalNumber(int n, int a, int b) { // 最大公倍数 int c = a * b / gcd(a, b); long left = 0, right = (long) Math.min(a, b) * n; while (left < right) { long mid = left + right >> 1; // 容斥原理 if (mid / a + mid / b - mid / c >= n) right = mid; else left = mid + 1; ...
LC.P2562[找出数组的串联值]
LC.P2562[找出数组的串联值]
方法一:模拟1234567891011class Solution { public long findTheArrayConcVal(int[] nums) { long ans = 0; int n = nums.length; for (int i = 0, j = n - 1; i < j; ++i, --j) { ans += Integer.parseInt(nums[i] + "" + nums[j]); } if (n % 2 == 1) ans += nums[n / 2]; return ans; }}
时间复杂度:$O(nlogM)$,其中$M$为数组中元素的最大值
空间复杂度:$O(logM)$,遍历数组时需要将数组中每个元素转换为字符串
LC.P162[寻找峰值]
LC.P162[寻找峰值]
方法一:二分1234567891011class Solution { public int findPeakElement(int[] nums) { int left = 0, right = nums.length - 1; while (left < right) { int mid = left + right >>> 1; if (nums[mid] > nums[mid + 1]) right = mid; else left = mid + 1; } return right; }}
时间复杂度:$O(logn)$
空间复杂度:$O(1)$
LC.P2512[奖励最顶尖的K名学生]
LC.P2512[奖励最顶尖的K名学生]
方法一:哈希表+排序12345678910111213141516171819202122class Solution { public List<Integer> topStudents(String[] positive_feedback, String[] negative_feedback, String[] report, int[] student_id, int k) { Set<String> positiveSet = new HashSet<>(List.of(positive_feedback)); Set<String> negativeSet = new HashSet<>(List.of(negative_feedback)); int n = report.length; int[][] arr = new int[n][2]; for (int i = 0; ...
LC.P911[在线选举]
LC.P911[在线选举]
方法一:哈希表+二分查找1234567891011121314151617181920212223242526272829303132class TopVotedCandidate { List<int[]> list = new ArrayList<>(); public TopVotedCandidate(int[] persons, int[] times) { Map<Integer, Integer> map = new HashMap<>(); int max = 0; for (int i = 0; i < persons.length; ++i) { map.merge(persons[i], 1, Integer::sum); if (map.get(persons[i]) >= max) { max = map.g ...
LC.P81[搜索旋转排序数组II]
LC.P81[搜索旋转排序数组II]
方法一:两次二分1234567891011121314151617181920212223242526272829class Solution { public boolean search(int[] nums, int target) { int n = nums.length; if (n == 1) return nums[0] == target; int left = 0, right = n - 1; // 忽略与 nums[0] 相同的元素,恢复二段性 while (left < right && nums[0] == nums[right]) --right; int idx = right; // 从中间开始找,找到满足 >= nums[0] 的分割点(旋转点) while (left < right) { int mid = ...
LC.P33[搜索旋转排序数组]
LC.P33[搜索旋转排序数组]
方法一:两次二分1234567891011121314151617181920212223242526class Solution { public int search(int[] nums, int target) { int n = nums.length; if (n == 1) return nums[0] == target ? 0 : -1; int left = 0, right = n - 1; // 从中间开始找,找到满足 >= nums[0] 的分割点(旋转点) while (left < right) { int mid = left + right + 1 >> 1; if (nums[mid] >= nums[0]) left = mid; else right = mid - 1; } ...
LC.P2731[移动机器人]
LC.P2731[移动机器人]
方法一:脑筋急转弯+排序123456789101112131415161718class Solution { private static final int MOD = (int) 1e9 + 7; public int sumDistance(int[] nums, String s, int d) { int n = nums.length; long[] arr = new long[n]; for (int i = 0; i < n; ++i) { arr[i] = (long) nums[i] + (s.charAt(i) == 'L' ? -d : d); } Arrays.sort(arr); long ans = 0, sum = 0; for (int i = 0; i < n; ++i) { ans ...