41. 缺失的第一个正数 - 力扣(LeetCode)
思路:
/**
创建一个标记数组
把出现过的正数标记为 1
找第一个没标记(0)的位置
返回它对应的数字
*/
class Solution {
public int firstMissingPositive(int[] nums) {
/**
创建一个标记数组
把出现过的正数标记为 1
找第一个没标记(0)的位置
返回它对应的数字
*/
int n=nums.length;
if(n==0) return 1;
int number[]=new int[n];
for(int i=0;i<n;i++){
//结果的数据只能在1~n+1里面, 大于n 的没必要看了
if(nums[i]>0 && nums[i]<=n){
number[nums[i]-1]=1;// 把出现过的正数标记为 1
}
}
//找第一个没标记(0)的位置
for(int i=0;i<n;i++){
if(number[i]==0){
return i+1;
}
}
//数组都满了,结果就是n+1
return n+1;
}
}
/**
直接暴力解法
**/
class Solution {
public int firstMissingPositive(int[] nums) {
Set<Integer> set=new HashSet<Integer>();
for(int i=0;i<nums.length;i++){
set.add(nums[i]);
}
int i=1;
while(set.contains(i)){
i++;
}
return i;
}
}
73. 矩阵置零 - 力扣(LeetCode)
思路:
思路一: 用 O(m+n)额外空间
两遍扫matrix,第一遍用集合记录哪些行,哪些列有0;第二遍置0
class Solution {
public void setZeroes(int[][] matrix) {
Set<Integer> row_set=new HashSet<>();
Set<Integer> col_set=new HashSet<>();;
int row=matrix.length;
int col=matrix[0].length;
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(matrix[i][j]==0){
row_set.add(i);
col_set.add(j);
}
}
}
//将行列置为0
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(row_set.contains(i) || col_set.contains(j)){
matrix[i][j]=0;
}
}
}
}
}
思路二: 用O(1)空间
关键思想: 用matrix第一行和第一列记录该行该列是否有0,作为标志位
但是对于第一行,和第一列要设置一个标志位,为了防止自己这一行(一列)也有0的情况.注释写在代码里,直接看代码很好理解!
class Solution {
public void setZeroes(int[][] matrix) {
int row_len=matrix.length;
int col_len=matrix[0].length;
boolean row_flag=false;
boolean col_flag=false;
//记录第一行是否有0
for(int j=0;j<col_len;j++){
if(matrix[0][j]==0){
row_flag=true;
break;
}
}
//记录第一列是否有0
for(int j=0;j<row_len;j++){
if(matrix[j][0]==0){
col_flag=true;
break;
}
}
//进行标志位的计算
for(int i=1;i<row_len;i++){
for(int j=1;j<col_len;j++){
if(matrix[i][j]==0){
matrix[0][j]=matrix[i][0]=0;
}
}
}
//进行放置0
for(int i=1;i<row_len;i++){
for(int j=1;j<col_len;j++){
if(matrix[i][0]==0 || matrix[0][j]==0){
matrix[i][j]=0;
}
}
}
if(row_flag){
for(int j=0;j<col_len;j++){
matrix[0][j]=0;
}
}
if(col_flag){
for(int i=0;i<row_len;i++){
matrix[i][0]=0;
}
}
}
}