Interval Sum I && II

本文介绍两种区间求和算法:一种适用于静态数组,通过预处理数组实现快速查询;另一种适用于动态数组,采用线段树实现查询与修改操作。

Given an integer array (index from 0 to n-1, where n is the size of this array), and an query list. Each query has two integers [start, end]. For each query, calculate the sum number between index start and end in the given array, return the result list.

Example

For array [1,2,7,8,5], and queries [(0,4),(1,2),(2,4)], return [23,9,20].

Analysis:
Use an array to save the sum from 0 to i. Then for query [i, j], we shoud return sum[j] - sum[i - 1].

 1 /**
 2  * Definition of Interval:
 3  * public classs Interval {
 4  *     int start, end;
 5  *     Interval(int start, int end) {
 6  *         this.start = start;
 7  *         this.end = end;
 8  *     }
 9  */
10 public class Solution {
11     /**
12      *@param A, queries: Given an integer array and an query list
13      *@return: The result list
14      */
15     public ArrayList<Long> intervalSum(int[] A, 
16                                        ArrayList<Interval> queries) {
17                                            
18         ArrayList<Long> list = new ArrayList<Long>();                                   
19         if (A == null || A.length == 0) return list;
20         if (queries == null || queries.size() == 0) return list;
21         
22         long[] sum = new long[A.length];
23         
24         for (int i = 0; i < sum.length; i++) {
25             if (i == 0) {
26                 sum[i] = A[i];
27             } else {
28                 sum[i] += sum[i - 1] + A[i];
29             }
30         }
31         
32         for (int i = 0; i < queries.size(); i++) {
33             Interval interval = queries.get(i);
34             if (interval.start == 0) {
35                 list.add(sum[interval.end]);
36             } else {
37                 list.add(sum[interval.end] - sum[interval.start - 1]);
38             }
39         }
40         return list;
41     }
42 }

 

Interval Sum II

Given an integer array in the construct method, implement two methods query(start, end)and modify(index, value):

  • For query(startend), return the sum from index start to index end in the given array.
  • For modify(indexvalue), modify the number in the given index to value
Example

Given array A = [1,2,7,8,5].

  • query(0, 2), return 10.
  • modify(0, 4), change A[0] from 1 to 4.
  • query(0, 1), return 6.
  • modify(2, 1), change A[2] from 7 to 1.
  • query(2, 4), return 14.

Analysis:

As the value in the array may change, so it is better to build a segement tree. If the value in the tree is changed, we also need to update its parent node.

 1 public class Solution {
 2     /* you may need to use some attributes here */
 3 
 4     SegmentTreeNode root;
 5 
 6     /**
 7      * @param A:
 8      *            An integer array
 9      */
10     public Solution(int[] A) {
11         if (A == null || A.length == 0)
12             return;
13         root = build(A, 0, A.length - 1);
14     }
15     
16     private SegmentTreeNode build(int[] A, int start, int end) {
17         if (A == null || start < 0 || end >= A.length)
18             return null;
19         SegmentTreeNode root = new SegmentTreeNode(start, end, 0);
20         if (start == end) {
21             root.sum = A[start];
22         } else {
23             int mid = (end - start) / 2 + start;
24             root.left = build(A, start, mid);
25             root.right = build(A, mid + 1, end);
26             root.sum = root.left.sum + root.right.sum;
27         }
28         return root;
29     }
30 
31     public long query(int start, int end) {
32         if (root == null || start > end)
33             return 0;
34         return helper(root, Math.max(0, start), Math.min(end, root.end));
35     }
36 
37     public long helper(SegmentTreeNode root, int start, int end) {
38         if (root.start == start && root.end == end) {
39             return root.sum;
40         }
41 
42         int mid = (root.start + root.end) / 2;
43         if (start >= mid + 1) {
44             return helper(root.right, start, end);
45         } else if (end <= mid) {
46             return helper(root.left, start, end);
47         } else {
48             return helper(root.left, start, mid) + helper(root.right, mid + 1, end);
49         }
50     }
51 
52     public void modify(int index, int value) {
53         if (root == null)
54             return;
55         if (index < root.start && index > root.end)
56             return;
57         modifyHelper(root, index, value);
58     }
59 
60     public void modifyHelper(SegmentTreeNode root, int index, int value) {
61         if (root.start == root.end && root.start == index) {
62             root.sum = value;
63             return;
64         }
65 
66         int mid = (root.start + root.end) / 2;
67         if (index >= mid + 1) {
68             modifyHelper(root.right, index, value);
69         } else {
70             modifyHelper(root.left, index, value);
71         }
72         root.sum = root.left.sum + root.right.sum;
73 
74     }
75 }
76 
77 class SegmentTreeNode {
78     public int start, end, sum;
79     public SegmentTreeNode left, right;
80 
81     public SegmentTreeNode(int start, int end, int sum) {
82         this.start = start;
83         this.end = end;
84         this.sum = sum;
85         this.left = this.right = null;
86     }
87 }

 

 

转载于:https://www.cnblogs.com/beiyeqingteng/p/5668864.html

void BSP_ADC_Caculate(void) { int32_t i, j; int32_t sum[ADC_CHANNEL_COUNT]; float PhaseSqrtSum[ADC_CHANNEL_COUNT]; float SumTmp; uint16_t volt_sample_cnt = 256; uint16_t pos_start = 32; uint16_t Range = 450; uint16_t idx_max[3]; uint16_t idx_min[3]; uint16_t Range1_3; uint16_t idx_interval[ADC_CHANNEL_COUNT]; float Freqidx_M1,Freqidx_M2; bool Stable = true; uint8_t FreqCalResetCntMax = 2; if( mMeasure.Analog.PhaseSel ) FreqCalResetCntMax = 2; else FreqCalResetCntMax = 3; for(i = 0; i < ADC_CHANNEL_COUNT; i++) { LPF1_CLR(); for (j = 0; j < 512; j++) { float tmp = mSampleBuffBack[i + j * ADC_CHANNEL_COUNT]; tmp *= 10; Result[j] = LPF1(tmp); } Range1_3 = Range/3; PeakFind(&Result[ pos_start + Range1_3 ],Range1_3,&idx_min[0],&idx_max[0]); if( idx_min[0] == 0) idx_min[0] = Range1_3 - 1; if( idx_max[0] == 0) idx_max[0] = Range1_3 - 1; idx_min[0] += Range1_3; idx_max[0] += Range1_3; if(idx_min[0] == idx_max[0]) { ;//mFreqRaw[i] = 44; //RTT_printf("B\r\n"); FreqCalResetCnt[i] = FreqCalResetCntMax; } else { if(idx_min[0] < idx_max[0]) { PeakFind(&Result[pos_start],idx_min[0],&idx_min[1],&idx_max[1]); PeakFind(&Result[pos_start + idx_min[0] ],Range-idx_min[0],&idx_min[2],&idx_max[2]); idx_max[2] += idx_min[0]; idx_interval[i] = DIFF_ABS(idx_max[1] , idx_max[2]); Freqidx_M1 = Result[pos_start + idx_max[1]]; Freqidx_M2 = Result[pos_start + idx_max[2]]; } else if(idx_max[0] < idx_min[0]) { PeakFind(&Result[pos_start],idx_max[0],&idx_min[1],&idx_max[1]); PeakFind(&Result[pos_start + idx_max[0] ],Range-idx_max[0],&idx_min[2],&idx_max[2]); idx_min[2] += idx_max[0]; idx_interval[i] = DIFF_ABS(idx_min[1] , idx_min[2]); Freqidx_M1 = Result[pos_start + idx_min[1]]; Freqidx_M2 = Result[pos_start + idx_min[2]]; } if( DIFF_ABS(Freqidx_M1,Freqidx_M2) < 300 ) { if(FreqCalResetCnt[i] > 0) FreqCalResetCnt[i]--; if(FreqCalResetCnt[i] == 0) { SumTmp = idx_interval[i]; //- 1.7; mFreqRaw[i] = (12800.0f / SumTmp); if( mFreqRaw[i] < 44 ) {mFreqRaw[i] = 44;} else if( mFreqRaw[i] > 62 ) {mFreqRaw[i] = 62;} } }else{ //RTT_printf("A[%d]:%f,%f\r\n",i,Freqidx_M1,Freqidx_M2); FreqCalResetCnt[i] = FreqCalResetCntMax; } } if( mMeasure.Analog.PhaseSel ) Stable = (FreqCalResetCnt[0] == 0 && FreqCalResetCnt[1] == 0 && FreqCalResetCnt[2] == 0); else Stable = (FreqCalResetCnt[0] == 0); if(Stable) { SumTmp = 0; FreqAvg[i].Raw[FreqAvgRawPos[i]] = mFreqRaw[i]; if(RawDataNum < FREQ_AVG_RAW_DATA_MAX) RawDataNum++; for(j = 0; j < RawDataNum; j++) SumTmp += FreqAvg[i].Raw[j]; FreqAvg[i].Val = SumTmp/RawDataNum; volt_sample_cnt = idx_interval[i]; sum[i] = 0; PhaseSqrtSum[i] = 0; for(j = 0; j < volt_sample_cnt; j++) { sum[i] += mSampleBuffBack[i + j * ADC_CHANNEL_COUNT]; } sum[i] /= volt_sample_cnt; for(j = 0; j < volt_sample_cnt; j++) { PhaseSqrtSum[i] += (mSampleBuffBack[i + j * ADC_CHANNEL_COUNT] - sum[i]) * (mSampleBuffBack[i + j * ADC_CHANNEL_COUNT] - sum[i]); } PhaseSqrtSum[i] /= volt_sample_cnt; arm_sqrt_f32(PhaseSqrtSum[i], &PhaseSqrtSum[i]); mVoltageRaw[i] = PhaseSqrtSum[i]; FreqAvgRawPos[i]++; if(FreqAvgRawPos[i] >= FREQ_AVG_RAW_DATA_MAX) FreqAvgRawPos[i] = 0; } } mAdcLock = 0; }
06-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值