✨hello,愿意点进来的小伙伴们,你们好呐!
✨ 系列专栏:【力扣刷题篇】
本篇内容:数组刷题篇
作者简介:一名现大二的三非编程小白
链接: 找到数组的中间元素
思路:
我们可以定义一个变量 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;
}
}
链接: 合并区间
思路:
我们先判断该二维数组长度是否为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()][]);
}
}
链接: 0矩阵
思路:
这道题我们可以用标记数组的思路,定义两个布尔类型的变量数组来记录清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;
}
}
}
}
}