详细见:leetcode.com/problems/search-insert-position
Java Solution: github
package leetcode;
public class P035_SearchInsertPosition {
public static void main(String[] args) {
System.out.println(new Solution().searchInsert(new int[] {1,3,5,6}, 69));
}
/*
* 0 ms
* 16.95%
* 又是试错型AC,今天怎么了
*/
static class Solution {
public int searchInsert(int[] nums, int target) {
if (nums == null || nums.length == 0)
return 0;
if (target > nums[nums.length - 1])
return nums.length;
return getIndex(nums, 0, nums.length - 1, target);
}
private int getIndex(int[] nums, int sti, int eni, int target) {
while (sti < eni) {
int mid = (sti + eni) >> 1;
// mid = (mid & 0x1) == 1 ? (mid >> 1) + 1 : mid >> 1;
if (nums[mid] > target)
eni = mid;
else if (nums[mid] < target)
sti = mid + 1;
else
return mid;
}
return sti;
}
}
}
C Solution: github
/*
url: leetcode.com/problems/search-insert-position/
3ms 23.90%
*/
int searchInsert(int* nums, int numsSize, int target) {
//first equal or larger
int i = 0, j = numsSize - 1, m = 0;
if (numsSize == 0) return 0;
if (nums[i] >= target) return i;
if (nums[j] < target) return j + 1;
while (i < j) {
m = i + (j - i) / 2;
if (nums[m] >= target) {
j = m;
} else {
i = m + 1;
}
}
return i;
}
int main() {
int nums[] = {1,3,5,6};
int v[] = {5, 2, 7, 0};
int i = 0;
int numsSize = 4;
for (i = 0; i < numsSize; i ++) {
printf("target is %d answer is %d \r\n", v[i], searchInsert(nums, numsSize, v[i]));
}
}
Python Solution: github
#coding=utf-8
'''
url: leetcode.com/problems/search-insert-position/
@author: zxwtry
@email: zxwtry@qq.com
@date: 2017年4月4日
@details: Solution: 58ms 21.67%
'''
class Solution(object):
def searchInsert(self, n, t):
"""
:type n: List[int]
:type t: int
:rtype: int
"""
nn = 0 if n == None else len(n)
if nn == 0: return 0
return self.binarySearchFirstEqualOrLarger(n, 0, nn, t)
#[i, j)
def binarySearchFirstEqualOrLarger(self, n, i, j, t):
j -= 1
if n[j] < t: return j + 1
while i < j:
m = (i + j) // 2
if n[m] >= t:
j = m
else:
i = m + 1
return i