算法设计与分析HW2:LeetCode35

Description:

Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.

You may assume no duplicates in the array.

Note:

Pay attention to the boundary condition.

Solution:

本题应该利用折半查找的方法以优化查找元素插入位置的效率(相比遍历查找),将升序排列的数组的中间位置作为比较的关键位置,将中间位置元素值与待插入元素值比较,如果两者相等,查找成功;否则利用中间位置元素将数组分成两个子数组,如果中间位置元素值大于待插入元素值,进一步前一数组(起始位置到中间位置),否则进一步查后一子数组(中间位置到结束位置),具体实现步骤可描述如下:

1.输入已排序数组,待插入的目标数字,数组长度

2.将数组的结束位置(下标最大值)与开始位置(下标最小值)作差,差值作为查找的边界条件

3.若差值为0或1,比较数组最小值(下标最小值的元素)与待插入目标数字的大小,若目标数字值比较大,返回下标最小值加1,否则,返回下标最小值

        4.若差值不为0或1,将当前数组长度除2,作为中间位置下标值

        5.若中间位置的元素恰好等于目标数字,这返回中间位置下标值

        6.若中间位置的元素的值大于目标数字,将开始位置(数组最小下标值)设为中间位置下标值,返回2(即递归调用函数,改变开始位置的参数)

        7.若中间位置的元素的值大于目标数字,将结束位置(数组最大下标值)设为中间位置下标值,返回2(即递归调用函数,改变结束位置的参数)

Codes:

package HW2;

public class HW2 
{
	static int BinSearch(int SortedArray[],int startPos,int endPos,int targetNum)  //核心是利用折半查找算法
	{
		int temp=endPos-startPos;
		//判断越界
		if(temp==0||temp==1)
		{
			if(SortedArray[startPos]>=targetNum) return startPos;
			else return startPos+1;
		}
		
		int midPos=temp/2;
		if(SortedArray[startPos+midPos]==targetNum) return startPos+midPos;
		if(SortedArray[startPos+midPos]>targetNum) return BinSearch(SortedArray,startPos+midPos,endPos,targetNum);
		else return BinSearch(SortedArray,startPos,startPos+midPos,targetNum);
		
	};
	
	public static int findInsertPos(int SortedArray[],int targetNum,int n)
	{
		return BinSearch(SortedArray,0,n,targetNum);
	};
};


Results:

算法设计与分析HW2:LeetCode35_第1张图片


你可能感兴趣的:(算法作业,leetcode,算法,优化)