題目:48. rotate image
將乙個矩形順時針翻轉90°解:先將矩形按行翻轉,然後進行mirror操作
class
solution
public
void
reverse
(int
matrix)
}public
void
mirrorrotate
(int
matrix)}}
public
void
swap
(int
matrix,
int i,
int j)
}
題目:307. range sum query - mutable(medium)
解1:使用遞迴實現buildtree, update和sumrange
class
numarray
"tree=%s\n",arrays.tostring(tree));
}public
void
buildtree
(int
nums,
int idx,
int left,
int right)
else
}public
void
update
(int i,
int val)
// update i, from top to bottom
// left,right is the range that idx holds, i is problem being asked
// invariant: left<=i<=right
private
void
updatesub
(int idx,
int left,
int right,
int i,
int diff)
int m = left +
(right-left)/2
;if(i<=m)
else
}public
intsumrange
(int i,
int j)
// invariant: left,right contains i,j
private
intsumrangesub
(int idx,
int left,
int right,
int i,
int j)
// 0 4
// 0,2,4,2
// 3,4,4,4
int m = left +
(right - left)/2
;// sum(i,l,r,x,y)
// i has range l,r, query x,y
// if l,r==x,y return tree[i]
// if l,r intersects x,y
// [l,m r]
// [i,j]
if(melse
if(m>=j)
else}}
/** * your numarray object will be instantiated and called as such:
* numarray obj = new numarray(nums);
* obj.update(i,val);
* int param_2 = obj.sumrange(i,j);
*/
解2:update操作不需要原陣列nums,只需要重新計算所有受影響的路徑即可
class
numarray
public
void
buildtree
(int
nums,
int idx,
int left,
int right)
public
void
update
(int i,
int val)
private
void
updatesub
(int idx,
int left,
int right,
int i,
int val)
int m = left +
(right-left)/2
;if(i<=m)
else
// important: recompute
tree[idx]
= tree[idx<<1]
+ tree[
(idx<<1)
|1];
}public
intsumrange
(int i,
int j)
// invariant: left,right contains i,j
private
intsumrangesub
(int idx,
int left,
int right,
int i,
int j)
}
將tree的值定義為區間的累加和,可以在o(logn)的時間內實現區間新增,如下:
tree=
# init added[v]=0 when build tree
update(
int idx,
int l,
int r,
int add)
:if l,r is the range
: tree[idx]
+=add
....sumrange(
int idx,
int l,
int r)
:return tree[idx]
+ sumrange(left)
+ sumrange(right)
增加額外的標記陣列和push操作,push操作定義為將marked標記清空,使得複製向下傳遞, update時,只需要設定一次marked[v]=true即可,get時,需要呼叫push來獲得必要的值
void push(
int v)
:if marked[v]
: t[v.left]
=t[v.right]
=t[v]
marked[v.left]
=marked[v.right]
=true
marked[v]
=false
get(
int v,
int l,
int r,
int i)
:if l==r:
return t[v]
push(v)
int m =
(l+r)/2
if i<=m:
return get(v.left,l,m,i)
else
return get(v.right,m+
1,r,i)
# 設定值
update(
int v,
int l,
int r,
int i,
int j,
int val)
:if i>j:
return
if(l==i&
&r==j)
: t[v]
=val
marked[v]
=true
return
push(v)..
.#update sub ranges
題目
求給定矩形的面積,給定的矩形與x軸和y軸平行題目
給定n個矩形r1,…,rn, 求r0是否被r1,…,rn完全覆蓋
矩陣中求子矩形
有乙個 n的矩形,其中每個元素只可能是0or1。比如如下矩陣a 1 1 0 0 0 0 1 1 1 0 1 0 1 1 0 1其中a 0 0 a 0 1 a 3 0 a 3 1 這四個元素恰好是乙個長方形的四個角,且每個元素都是1.因此稱這四個元素圍成了乙個子矩形。現在需要判斷,給定的矩陣a中,判斷...
poj 3420 dp 矩陣 矩形填充
include include include include include include using namespace std define ll long long const int maxn 1 4 4 乙個狀態可以推出多個狀態 int pre maxn now maxn int m,...
洛谷 最大加權矩形 字首和,dp,矩陣壓縮
題目鏈結 題目 思路 這個就類似最大子串行,有人會問,這和最大子串行有關係?其實在我們進行矩陣壓縮後,這個問題其實就變成了最大子串行 矩陣壓縮 我的理解就是把矩陣分成小的矩陣 把每種情況都分出來 例我們有矩陣 1 2 3 4 5 6 7 8 9 我們先列舉第一行 1 2 3.再加上的第二行 1 2 ...