算法思路
3487. 删除后的最大子数组元素和思路:简单题,简单做,可以无限删除要求最大把大于0的全部加一次就行了,如果全部小于0就返回一个最大的。
class Solution {
public int maxSum(int[] nums) {
int min = Integer.MIN_VALUE;
HashSet<Integer> set = new HashSet<>();
int sum = 0;
for (int num : nums) {
min = Math.max(min, num);
if (num >= 0) {
if (!set.contains(num)) {
sum += num;
set.add(num);
}
}
}
if (min < 0) {
return min;
} else {
return sum;
}
}
}
344. 反转字符串思路:双指针直接互换,创建一个缓冲交换的字符就行了简单题,简单思路。
class Solution {
public void reverseString(char[] s) {
int left = 0, right = s.length - 1;
while (left < right) {
char temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
}
2540. 最小公共值思路:简单题简单做,排序然后找两个的第一个相同值。
class Solution {
public int getCommon(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
int left = 0, right = 0;
int res = -1;
while (left < nums1.length && right < nums2.length) {
if (nums1[left] == nums2[right]) {
res = nums1[left];
return res;
} else if (nums1[left] < nums2[right]) {
left++;
}else {
right++;
}
}
return res;
}
}
2570. 合并两个二维数组 - 求和法思路:双指针,然后要记得处理多余的数组。使用一个List来存储然后最后给这个List.toArray。
class Solution {
public int[][] mergeArrays(int[][] nums1, int[][] nums2) {
// 检查输入
if (nums1 == null) return nums2;
if (nums2 == null) return nums1;
List<int[]> merged = new ArrayList<>();
int left = 0, right = 0;
while (left < nums1.length && right < nums2.length) {
if (nums1[left][0] == nums2[right][0]) {
merged.add(new int[]{nums1[left][0], nums1[left][1] + nums2[right][1]});
left++;
right++;
} else if (nums1[left][0] < nums2[right][0]) {
merged.add(new int[]{nums1[left][0], nums1[left][1]});
left++;
} else {
merged.add(new int[]{nums2[right][0], nums2[right][1]});
right++;
}
}
// 处理剩余元素
while (left < nums1.length) {
merged.add(new int[]{nums1[left][0], nums1[left][1]});
left++;
}
while (right < nums2.length) {
merged.add(new int[]{nums2[right][0], nums2[right][1]});
right++;
}
// 转换为二维数组
return merged.toArray(new int[merged.size()][]);
}
}
350. 两个数组的交集 II思路:双指针,然后一个list来存储相同的不要考虑多余的元素因为只要相同的,找完相同的就行了。
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
if (nums1 == null || nums2 == null) return null;
// 先对数组排序(如果输入未排序)
Arrays.sort(nums1);
Arrays.sort(nums2);
int left = 0, right = 0;
List<Integer> intersect = new ArrayList<>();
while (left < nums1.length && right < nums2.length) {
if (nums1[left] == nums2[right]) {
intersect.add(nums1[left]);
left++;
right++;
} else if (nums1[left] < nums2[right]) {
left++;
} else {
right++;
}
}
return intersect.stream().mapToInt(i -> i).toArray();
}
}
LCP 18. 早餐组合思路:先排序然后使用双指针一个从小往上一个从大往小,然后相加小于给的钱那么这个大的前面的都是可以满足条件的。
class Solution {
public int breakfastNumber(int[] staple, int[] drinks, int x) {
Arrays.sort(staple);
Arrays.sort(drinks);
int cnt = 0;
int m = staple.length, n = drinks.length;
int i = 0, j = n - 1;
while (i < m && j >= 0) {
if (staple[i] + drinks[j] <= x) {
cnt = (cnt + j + 1) % 1000000007;
i++;
} else {
j--;
}
}
return cnt % 1000000007;
}
}