算法打卡

36 阅读2分钟

算法思路

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;
    }
}