牛客网刷题-二分查找

  1. 二维数组中的查找
    找到满足条件的最左下角;
    然后往上的二维数组进行二层循环遍历;
public class Solution {
    public boolean Find(int target, int [][] array) {
        int hight = array.length;
        int wide = array[0].length;

        if(hight == 0 || wide == 0){
            return false;
        }
        int endi = 0;
        while(endi < hight && array[endi][0] <= target){
            endi++;
        } //endi-1;找到满足条件的最左小角

        //开始二维数组的双层循环找目标值
        for(int i=endi-1;i>=0;i--){
            for(int j=0;j<wide;j++){
                if(array[i][j] == target){
                    return true;
                }
                if(array[i][j] > target){
                    continue;
                }
            }
        }
        
        return false;
    }
}

  1. 旋转数组的最小数值【注意只经历一次旋转,那么出现转折的那个点,就是答案】
import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int [] array) {
        int min = array[0];
        int len = array.length;
        for(int i=0;i<len-1;i++){
            if(array[i] > array[i+1]){
                min = array[i+1];
                break;
            }
        }
        return min;
    }
}

  1. 比较版本号【字符串分割-转义字符;字符数字转成数字】
    思路:将字符串版本号按照指定规则分割转成字符串数组;
    按照最长字符串数组进行遍历 空缺的用0补
    然后依次取出每个字符串数组的值 转成数值类型
    最后将两个数值进行比较
import java.util.*;
public class Solution {
    public int compare (String version1, String version2) {
        String[] nums1 = version1.split("\\.");
        String[] nums2 = version2.split("\\.");

        for(int i=0;i<Math.min(nums1.length,nums1.length);i++){
            String str1 = i < nums1.length ? nums1[i] : "0";
            String str2 = i < nums2.length ? nums2[i] : "0";
            long num1 = 0;
            for(int j=0;j<str1.length();j++){
                num1 = num1*10+(str1.charAt(j) - '0');
            }
            long num2 = 0;
            for(int j=0;j<str2.length();j++){
                num2 = num2*10+(str2.charAt(j) - '0');
            }
            if(num1 > num2){
                return 1;
            }
            if(num2 > num1){
                return -1;
            }
        }
        return 0;
    }
}
  1. 寻找峰值
    思路:根据峰值所在位置进行划分;
    在第一个;
    在最后一个;
    在中间;
    特别要注意,数组长度为一的情况。
import java.util.*;
public class Solution {
    public int findPeakElement (int[] nums) {
        int idx = 0;
        if(nums.length == 1){ //一个值的情况
            return idx;
        }
        if(nums.length == 2 && nums[0] > nums[1]){ //峰值在最开始的情况
            return idx;
        }
        if(nums[nums.length-1] > nums[nums.length-2]){//峰值在最后的情况
            return nums.length-1;
        }
        for(int i=1;i<nums.length-2;i++){ //峰值在中间的情况
            if(nums[i-1] < nums[i] && nums[i+1] < nums[i]){
                idx = i;
            }
        }
        return idx;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值