LeetCode 307. Range Sum Query - Mutable in F#
URL
leetcode.com/problems/range-sum-query-mutable
Code
github.com/syohex/dotnet-study/blob/master/..
type NumArray =
{ Len: int
Tree: int [] }
static member init(nums: int []) : NumArray =
let len = nums.Length
let tree = Array.zeroCreate (2 * len)
for i in len .. (2 * len - 1) do
tree.[i] <- nums.[i - len]
seq { 0 .. (len - 1) }
|> Seq.rev
|> Seq.iter (fun i -> tree.[i] <- tree.[2 * i] + tree.[2 * i + 1])
{ Len = len; Tree = tree }
static member update (index: int) (value: int) (na: NumArray) : unit =
let rec update' index (na: NumArray) =
if index <= 0 then
()
else
let left, right =
if index % 2 = 1 then
index - 1, index
else
index, index + 1
let parent = index / 2
na.Tree.[parent] <- na.Tree.[left] + na.Tree.[right]
update' parent na
na.Tree.[na.Len + index] <- value
update' (na.Len + index) na
static member sumRange (left: int) (right: int) (na: NumArray) : int =
let rec sumRange' left right (na: NumArray) acc =
if left > right then
acc
else
let acc', left' =
if left % 2 = 1 then
acc + na.Tree.[left], left + 1
else
acc, left
let acc'', right' =
if right % 2 = 0 then
acc' + na.Tree.[right], right - 1
else
acc', right
sumRange' (left' / 2) (right' / 2) na acc''
sumRange' (left + na.Len) (right + na.Len) na 0