算法設計與分析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:



發佈了35 篇原創文章 · 獲贊 0 · 訪問量 4643
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章