在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座標就足夠了。開始座標總是小於結束座標。平面內最多存在104個氣球。
一支弓箭可以沿著x軸從不同點完全垂直地射出。在座標x處射出一支箭,若有乙個氣球的直徑的開始和結束座標為 xstart,xend, 且滿足 xstart ≤ x ≤ xend,則該氣球會被引爆。可以射出的弓箭的數量沒有限制。 弓箭一旦被射出之後,可以無限地前進。我們想找到使得所有氣球全部被引爆,所需的弓箭的最小數量。
example:解法1,不對陣列進行排序,每次都要進行比較輸入:[[10,16], [2,8], [1,6], [7,12]]
輸出:2
解釋:對於該樣例,我們可以在x = 6(射爆[2,8],[1,6]兩個氣球)和 x = 11(射爆另外兩個氣球)。
分析:1)找到end最小值對應的氣球,標註為p1,在p1_end處射爆氣球,則所有與p1交集的氣球都可以被射爆(如下圖ar1);
問題:哪些氣球pi與p1有交集呢?只要求pi_start<=p1_end即可;(如下圖中的p2,p3的start都小於p1_end)
for(i=0;istart&&points[i][1]<=end)2)現在只需要考慮start>p1_end的氣球即可;尋找到這樣乙個氣球,標註為p2,(p2肯定與p1沒有交集),在p2_end處射爆氣球,則所有與p2有交集但是與p1沒有交集的氣球都可以被射爆;}
start=points[k][1];3)類推,找到氣球p3,要求p3_start>p2_end,...
**:
public class solution ,,,};
solution test=new solution();
system.out.println(test.findminarrowshots(arr));
}public int findminarrowshots(int points)
}if(flag)
}return ans;}}
參考:
解法2,對陣列按照第二個元素進行排序
參考:
所以首先,我們在第4位進行射擊,我們通過陣列看到所有前4個氣球都可以通過這一次射擊得到照顧。然後我們需要另乙個射擊最後乙個氣球。所以結果應該是2。
/**
* lambda陣列排序
* 對二維陣列裡面的元素(子陣列)進行排序
* 例如:a,b 子陣列也是相當於,
* a[0]=10,a[1]=16,用a[1]-b[1]相當於按照子陣列中的第二個元素進行公升序排序;
* b[1]-a[1]相當於按照子陣列中的第二個元素進行降序排序;
*/
arrays.sort(points, (a, b) -> a[1] - b[1]);//lambda陣列正序排序
public int findminarrowshots(int points)
/*** lambda陣列排序
* 對二維陣列裡面的元素(子陣列)進行排序
* 例如:a,b 子陣列也是相當於,
* a[0]=10,a[1]=16,用a[1]-b[1]相當於按照子陣列中的第二個元素進行公升序排序;
* b[1]-a[1]相當於按照子陣列中的第二個元素進行降序排序;
*/arrays.sort(points, (a, b) -> a[1] - b[1]);//lambda陣列正序排序
int arrowpos = points[0][1];
int arrowcnt = 1;
for (int i = 1; i < points.length; i++)
arrowcnt++;
arrowpos = points[i][1];
}return arrowcnt;
}
用最少數量的箭引爆氣球
在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座標就足夠了。開始座標總是小於結束座標。平面內最多存在104個氣球。一支弓箭可以沿著x軸從不同點完全垂直地射出。在座標x處射出一支箭,若有乙個氣...
用最少數量的箭引爆氣球
在二維空間中有許多球形的氣球。對於每個氣球,提供的輸入是水平方向上,氣球直徑的開始和結束座標。由於它是水平的,所以y座標並不重要,因此只要知道開始和結束的x座標就足夠了。開始座標總是小於結束座標。平面內最多存在104個氣球。一支弓箭可以沿著x軸從不同點完全垂直地射出。在座標x處射出一支箭,若有乙個氣...
用最少數量的箭引爆氣球
思考 首先將樣例畫圖,找出規律理解題意,其次舉例子,1個氣球最少用1個箭,2個重疊氣球最少用乙個箭,3個重疊氣球最少用乙個箭 因此,盡量使氣球重疊部分最多一些,那麼如何演算法化呢?當然是排序,然後遍歷維護射擊區間。1,排序,按照左端點。2,遍歷氣球陣列,維護乙個設計區間,初始化就是第乙個氣球的區間,...