赞
踩

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
样例输入:nums = [1,3,5,6], target = 5
样例输出:2
int searchInsert(int* nums, int numsSize, int target){}

首先,我们需要考虑一下,插入的这个位置,需要满足什么条件?
如果我们对数组进行划分,大于等于目标值的作为绿色元素,其余作为红色元素。如果有目标值,那么绿色元素的左边界就是我们要找的索引;如果没有目标值,绿色元素的左边界也是我们要找的索引。
总的时间复杂度为 O ( l o g 2 n ) O(log_2n) O(log2n)。
/************** 二分查找 数组 模板 **************/ /* 1)传参的数组满足:红红红红红红红红绿绿绿绿绿绿绿; 2)返回值:绿色区段的左边界; */ int isGreen(int val, int x); int binarySearch(int *arr, int arrSize, int x) { int l = -1, r = arrSize; int mid; while(l + 1 < r) { mid = l + (r - l) / 2; if( isGreen(arr[mid], x) ) r = mid; else l = mid; } return r; } /************** 二分查找 数组 模板 **************/ int isGreen(int val, int x) { return val >= x; } int searchInsert(int* nums, int numsSize, int target){ return binarySearch(nums, numsSize, target); // (1) }
有序数组一般可以优先考虑 二分查找。

相信看我文章的大多数都是「 大学生 」,能上大学的都是「 精英 」,那么我们自然要「 精益求精 」,如果你还是「 大一 」,那么太好了,你拥有大把时间,当然你可以选择「 刷剧 」,然而,「 学好算法 」,三年后的你自然「 不能同日而语 」。
那么这里,我整理了「 几十个基础算法 」 的分类,点击开启:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。