OfferX 矩形和矩陣

2021-10-03 09:51:00 字數 4239 閱讀 7490

題目: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 ...