1、二进制矩阵中的特殊位置
//给你一个大小为 rows x cols 的矩阵 mat,其中 mat[i][j] 是 0 或 1,请返回 矩阵 mat 中特殊位置的数目 。 // // 特殊位置 定义:如果 mat[i][j] == 1 并且第 i 行和第 j 列中的所有其他元素均为 0(行和列的下标均 从 0 开始 ),则位置 (i, //j) 被称为特殊位置。 // // // // 示例 1: // // 输入:mat = [[1,0,0], // [0,0,1], // [1,0,0]] //输出:1 //解释:(1,2) 是一个特殊位置,因为 mat[1][2] == 1 且所处的行和列上所有其他元素都是 0 // // // 示例 2: // // 输入:mat = [[1,0,0], // [0,1,0], // [0,0,1]] //输出:3 //解释:(0,0), (1,1) 和 (2,2) 都是特殊位置 // // // 示例 3: // // 输入:mat = [[0,0,0,1], // [1,0,0,0], // [0,1,1,0], // [0,0,0,0]] //输出:2 // // // 示例 4: // // 输入:mat = [[0,0,0,0,0], // [1,0,0,0,0], // [0,1,0,0,0], // [0,0,1,0,0], // [0,0,0,1,1]] //输出:3 // // // // // 提示: // // // rows == mat.length // cols == mat[i].length // 1 <= rows, cols <= 100 // mat[i][j] 是 0 或 1 // // Related Topics 数组
我是通过获取每一行和每一列中1的个数,如果出现一行、一列两者中都只有一个1,那么我们再去判断这个1是不是在行列相交的位置。
public int numSpecial(int[][] mat) {
int m = mat.length;
int n = mat[0].length;
int sum = 0;
int[] arr1 = new int[m];
int[] arr2 = new int[n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if(mat[i][j] == 1){
arr1[i]++;
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if(mat[j][i] == 1){
arr2[i]++;
}
}
}
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr2.length; j++) {
if(arr1[i] == 1 && arr2[j] == 1 && mat[i][j] == 1){
sum++;
}
}
}
return sum;
}
2、特征数组的特征值
//给你一个非负整数数组 nums 。如果存在一个数 x ,使得 nums 中恰好有 x 个元素 大于或者等于 x ,那么就称 nums 是一个 特殊数组 ,而 // x 是该数组的 特征值 。 // // 注意: x 不必 是 nums 的中的元素。 // // 如果数组 nums 是一个 特殊数组 ,请返回它的特征值 x 。否则,返回 -1 。可以证明的是,如果 nums 是特殊数组,那么其特征值 x 是 唯一的 // 。 // // // // 示例 1: // // 输入:nums = [3,5] //输出:2 //解释:有 2 个元素(3 和 5)大于或等于 2 。 // // // 示例 2: // // 输入:nums = [0,0] //输出:-1 //解释:没有满足题目要求的特殊数组,故而也不存在特征值 x 。 //如果 x = 0,应该有 0 个元素 >= x,但实际有 2 个。 //如果 x = 1,应该有 1 个元素 >= x,但实际有 0 个。 //如果 x = 2,应该有 2 个元素 >= x,但实际有 0 个。 //x 不能取更大的值,因为 nums 中只有两个元素。 // // 示例 3: // // 输入:nums = [0,4,3,0,4] //输出:3 //解释:有 3 个元素大于或等于 3 。 // // // 示例 4: // // 输入:nums = [3,6,7,7,0] //输出:-1 // // // // // 提示: // // // 1 <= nums.length <= 100 // 0 <= nums[i] <= 1000 // // Related Topics 数组
这个就是一个插值,首先将数组排下序,先判断数组中所有的数都大于特征值的时候,如果特征值存在,则必有length<=nums[0],其次插在中间,则必须要满足大于前面的,小于等于后面的,而且长度要和后面的数量保持一致。
public int specialArray(int[] nums) {
Arrays.sort(nums);
int len = nums.length;
if(len <= nums[0]){
return len;
}
int count = 1;
for (int i = len-1; i >=1 ; i--) {
if(count<=nums[i] && count > nums[i-1]){
return count;
}
count++;
}
return -1;
}