前言
刷题链接:
https://www.nowcoder.com/exam/oj/ta?page=2&tpId=13&type=265
1. 搜索算法
JZ53 数字在升序数组中出现的次数
思路:遍历数组,count记录k值出现次数,返回count
public class Solution {
public int GetNumberOfK(int [] array , int k) {
int count = 0;
for(int i = 0; i<array.length;i++){
if(array[i] == k){
count++;
}
}
return count;
}
}
JZ4 二维数组中的查找
思路:暴力遍历法,此时时间复杂度为O(n2)
public class Solution {
public boolean Find(int target, int [][] array) {
boolean flag = false;
for(int i=0;i<array.length;i++){
for(int j=0;j<array[i].length;j++){
if(array[i][j] == target){
flag = true;
}
}
}
return flag;
}
}
进阶:空间复杂度 O(1) ,时间复杂度 O(n+m)
思路:观察矩阵特性为 某元素左下大于上方,小于右方。
首先以左下角为起点,若是它小于目标元素,则往右移动去找大的,若是他大于目标元素,则往上移动去找小的。
public class Solution {
public boolean Find(int target, int [][] array) {
if(array.length==0 || array[0].length==0){
return false;
}
int j=0;
int i=array.length-1;
while(i>=0 && j<array[0].length){
if(target<array[i][j]){
i--;
}else if(target>array[i][j]){
j++;
}else{
return true;
}
}
return false;
}
}
JZ11 旋转数组的最小数字
- 暴力法
public class Solution {
public int minNumberInRotateArray(int [] array) {
int min = array[0];
for(int i=0;i<array.length;i++){
if(min>array[i]){
min = array[i];
}
}
return min;
}
}
- 二分法
public class Solution {
public int minNumberInRotateArray(int [] array) {
int i=0;
int j=array.length-1;
while(i<j){
int m = (i+j)/2;
if(array[m]>array[j]){
i = m+1;
}else if(array[m]<array[j]){
j = m;
}else{
j--;
}
}
return array[i];
}
}