力扣刷题篇之【数组篇】

✨hello,愿意点进来的小伙伴们,你们好呐!
✨ 系列专栏:【力扣刷题篇】
本篇内容:数组刷题篇
作者简介:一名现大二的三非编程小白

    • 1. 找到数组的中间元素
    • 2. 合并区间
    • 3. 0矩阵

1. 找到数组的中间元素

链接: 找到数组的中间元素

力扣刷题篇之【数组篇】_第1张图片

思路:
我们可以定义一个变量 sum 将数组所有的元素累加起来,然后再继续重新遍历一遍数组,
定义变量 leftSum 来存储从下标 j 之前的元素的总和,这样子的话,下标 j 后面的元素的总和就等于 sum - leftSum - num【j】,当下标 j 左右的元素和相同时,leftSum * 2 + num【j】 == sum,所以我们可以依靠该公式来判断是否相等

class Solution {
    public int findMiddleIndex(int[] nums) {
        int sum = 0;
        for(int i = 0;i < nums.length;i++){
            sum += nums[i];
        }
        int leftSum = 0;
        for(int j = 0; j < nums.length;j++){
            if(2 * leftSum + nums[j] == sum){
                return j;
            }
            leftSum += nums[j];
        }
        return -1;
    }
}

2. 合并区间

链接: 合并区间
力扣刷题篇之【数组篇】_第2张图片
思路:
我们先判断该二维数组长度是否为0,是则返回一个null数组。
然后将二维数组进行排序,new 一个顺序表 ArrayList来存储正确格式的数组。
在 for 循环中遍历二维数组中所有的一维数组,将每个数组的起始数和结束值,记录下来,如果顺序表的大小为0或者数组符合要求的话,就直接往顺序表尾插入该数组,若不符合要求的话,就修改顺序表最尾的元素的结束值,修改为:当前的顺序表最尾的元素的结束值与下标为 i 的数组的结束值的最大值,最后将顺序表转成二维数组返回

class Solution {
    public int[][] merge(int[][] intervals) {
        if(intervals.length == 0){
            return new int[0][2];
        }

        Arrays.sort(intervals,new Comparator<int[]>(){
            public int compare(int[] intervals1,int[] intervals2){
                return intervals1[0] - intervals2[0];
            }
        });

        List<int[]> list = new ArrayList();
        for(int i = 0; i < intervals.length;i++){
            int L = intervals[i][0];
            int R = intervals[i][1];
            if(list.size() == 0 || list.get(list.size() - 1)[1] < L){
                list.add(new int[]{L,R});
            }else{
                list.get(list.size() - 1)[1] = Math.max(list.get(list.size() - 1)[1],R);
            }
        }
        return list.toArray(new int[list.size()][]);
    }
}

3. 0矩阵

链接: 0矩阵
力扣刷题篇之【数组篇】_第3张图片
思路:
这道题我们可以用标记数组的思路,定义两个布尔类型的变量数组来记录清0 的行与列,然后再嵌套循环将数组内的元素清 0。

class Solution {
    public void setZeroes(int[][] matrix) {
        int len1 = matrix.length;
        int len2 = matrix[0].length;
        boolean[] row = new boolean[len2];
        boolean[] col = new boolean[len1];

        for(int i = 0;i < len1;i++){
            for(int j = 0;j < len2;j++){
                if(matrix[i][j] == 0){
                    row[j] = col[i] = true;
                }
            }
        }

        for(int i = 0;i < len1;i++){
            for(int j = 0;j < len2;j++){
                if(row[j] == true || col[i] == true){
                    matrix[i][j] = 0;
                }
            }
        }
    }
}

你可能感兴趣的:(力扣刷题篇,leetcode,算法,职场和发展)