2022-3-1 剑指offer day19
题1:
JZ53 数字在升序数组中出现的次数
描述
给定一个长度为 n 的非降序数组和一个非负数整数 k ,要求统计 k 在数组中出现的次数
数据范围:0 \le n \le 1000 , 0 \le k \le 1000≤n≤1000,0≤k≤100,数组中每个元素的值满足 0 \le val \le 1000≤val≤100
要求:空间复杂度 O(1)O(1),时间复杂度 O(logn)O(logn)
要求:空间复杂度 O(1)O(1),时间复杂度 O(logn)O(logn)
1 public class Solution { 2 public int GetNumberOfK(int [] array , int k) { 3 int ans=0; 4 for (int s:array){ 5 if (s==k) ans++; 6 if (s>k) break; 7 } 8 return ans; 9 } 10 }
思路:遍历数组,超过k直接退出。
题2:
JZ4 二维数组中的查找
描述
在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
给定 target = 7,返回 true。
给定 target = 3,返回 false。
数据范围:矩阵的长宽满足 0 \le n,m \le 5000≤n,m≤500 , 矩阵中的值满足 0 \le val \le 10^90≤val≤109
进阶:空间复杂度 O(1)O(1) ,时间复杂度 O(n+m)O(n+m)
进阶:空间复杂度 O(1)O(1) ,时间复杂度 O(n+m)O(n+m)
1 public class Solution { 2 public boolean Find(int target, int [][] array) { 3 int m=array.length,n=array[0].length; 4 int i=m-1,j=0; 5 while (i>=0&&i<m&&j>=0&&j<n){ 6 if (target==array[i][j]) return true; 7 if (target>array[i][j]) { 8 j++; 9 }else { 10 i--; 11 } 12 } 13 return false; 14 } 15 }
思路:根据二维数组的结构,从左下角或者右上角开始找,右边更大,上边更小。