算法总结

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 @ 2022-09-15 22:06  chenghaixinag  阅读(23)  评论(0编辑  收藏  举报