算法总结

1.查找插入位置

给定一个排序的整数数组 nums 和一个整数目标值 target ,请在数组中找到 target ,并返回其下标。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。
题解: 一个常规的二分查找,二分查找一般用在有规律的数组中查找元素

复制代码
package com.chenghaixiang.jianzhi2.day23;

/**
 * @author 程海翔
 * @school 石家庄铁道大学
 */
public class Office068 {
}
//给定一个排序的整数数组 nums 和一个整数目标值 target ,请在数组中找到 target ,并返回其下标。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
//
//请必须使用时间复杂度为 O(log n) 的算法。
class Solution {
    //二分查找
    //注意这题比普通二分查找多了一个如果没找到返回它将会被按顺序插入的位置。
    public int searchInsert(int[] nums, int target) {
        int n=nums.length;
        int left=0,right=n-1,res=0;
        //二分查找
        while (left<=right){
            int mid=(left+right)/2;
            if(target==nums[mid]){
                return res=mid;
            }
            if(target<nums[mid]){
                right=mid-1;
            }else{
                left=mid+1;
            }
        }
        //如果没找到,left即是插入位置
        return left;
    }
}
View Code
复制代码

2.山峰数组的顶部

符合下列属性的数组 arr 称为 山峰数组(山脉数组) :

    arr.length >= 3
    存在 i(0 < i < arr.length - 1)使得:
        arr[0] < arr[1] < ... arr[i-1] < arr[i]
        arr[i] > arr[i+1] > ... > arr[arr.length - 1]

给定由整数组成的山峰数组 arr ,返回任何满足 arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1] 的下标 i ,即山峰顶部。

复制代码
package com.chenghaixiang.jianzhi2.day23;

/**
 * @author 程海翔
 * @school 石家庄铁道大学
 */
public class Office069 {
}
//符合下列属性的数组 arr 称为 山峰数组(山脉数组) :
//
//    arr.length >= 3
//    存在 i(0 < i < arr.length - 1)使得:
//        arr[0] < arr[1] < ... arr[i-1] < arr[i]
//        arr[i] > arr[i+1] > ... > arr[arr.length - 1]
//
//给定由整数组成的山峰数组 arr ,返回任何满足 arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1] 的下标 i ,即山峰顶部。

class Solution02 {
    //二分查找
    public int peakIndexInMountainArray(int[] arr) {
        int n=arr.length;
        //left=1,right=n-2因为题目给的数组是大于等于3的山峰数组,用left=0,right=n-1也可以
        int left=1,right=n-2;
        int res=0;
        while (left<=right){
            int mid=(right+left)/2;
            //arr[mid]>arr[mid+1]证明目标值在左侧
            if(arr[mid]>arr[mid+1]){
                res=mid;
                right=mid-1;
            }else {
                //证明目标值在右侧
                left=mid+1;
            }
        }
        return res;
    }
}
View Code
复制代码

 

posted @   chenghaixinag  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2021-09-15 每日总结
点击右上角即可分享
微信分享提示