タイトル
ソートされた配列とターゲットを考えると、配列内のオブジェクトを検索し、そのインデックスを返します。標的がアレイに存在しない場合、それが配列に挿入された位置に戻されます。
あなたは、アレイ内のことは、重複要素をとることができます。
例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
アルゴリズムやアイデア
二段階で:
配列中の標的を見つけるための最初のステップと、そのインデックスを返し、
第2工程を、アレイから、それが配列に挿入された位置に戻されます。
/**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(target<nums[0]) {
return 0;
}else if(target>nums[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]<target && target <=nums[mid]) {
right = mid;
}else if(nums[mid]<target && target <=nums[right]) {
left = mid;
}
mid = (left+right) >>> 1;
}
return leftP;
}
}