题目 【零基础学数据结构|搜索插入位置(java)】给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2
输出: 1
示例 3:
输入: [1,3,5,6], 7
输出: 4
示例 4:
输入: [1,3,5,6], 0
输出: 0
算法与思路 分两步:
第一步,在数组中找到目标值,并返回其索引;
第二步,不在数组中,返回它将会被按顺序插入的位置。
/**search-insert-position-两次循环法*/
public int searchInsert_1(int[] nums, int target) {
int index = indexOf(nums,target);
if(index!=-1) {
return index;
}
return insert(nums,target);
} /**查询索引*/
private int indexOf(int[] nums, int target) {
for (int i = 0;
i < nums.length;
i++) {
if(nums[i]==target) {
return i;
}
}
return -1;
} /**插入*/
private int insert(int[] nums, int target) {
int j=0;
for (j = 0;
j < nums.length;
j++) {
if(nums[j]>target) {
break;
}
}
return j;
}
仔细分析题目后,发现一步也可以。只要找到在数组中,大于等于
target
的元素的下标即可。 /**search-insert-position-一次循环法*/
public int searchInsert_2(int[] nums, int target) {
int i;
for (i = 0;
i < nums.length;
i++) {
if(nums[i]>=target)return i;
}
return i;
}
进一步优化,采用二分查找算法
class Solution { public int searchInsert(int[] nums, int target) {
if(targetnums[nums.length-1]) {
return nums.length;
}
int left = 0;
int right = nums.length-1;
int mid = right >>> 1;
int leftP = -1;
//先找最上位置
while(left<=right) {
if(nums[left]==target) {
leftP = left;
break;
}else if(right<=left+1) {
//避免死循环
leftP = right;
break;
}
if(nums[left]>> 1;
}
return leftP;
}
}
推荐阅读
- ACM|HDU 5322 Hope (CDQ分治+NTT)
- 牛客算法周周练15——A、B
- Codeforces Round #609 (Div. 2)——C. Long Beautiful Integer(思维)
- FZU - 2107题解
- ACM OJ 2036 多边形面积计算
- #|【牛客】牛客练习赛67-E-牛妹游历城市——位运算优化
- ACM|回文树(自动机)(练习和总结)
- acm|扩展欧几里德算法(附证明)
- ACM|[dsu] codeforces 375D. Tree and Queries
- ACM|codeforces 732-D. Exams (二分)