摘要:題目要求將包含大于等于三個元素且任意相鄰兩個元素之間的差相等的數組成為等差數列。現在輸入一個隨機數組,問該數組中一共可以找出多少組等差數列。
題目要求
A sequence of number is called arithmetic if it consists of at least three elements and if the difference between any two consecutive elements is the same. For example, these are arithmetic sequence: 1, 3, 5, 7, 9 7, 7, 7, 7 3, -1, -5, -9 The following sequence is not arithmetic. 1, 1, 2, 5, 7 A zero-indexed array A consisting of N numbers is given. A slice of that array is any pair of integers (P, Q) such that 0 <= P < Q < N. A slice (P, Q) of array A is called arithmetic if the sequence: A[P], A[p + 1], ..., A[Q - 1], A[Q] is arithmetic. In particular, this means that P + 1 < Q. The function should return the number of arithmetic slices in the array A. Example: A = [1, 2, 3, 4] return: 3, for 3 arithmetic slices in A: [1, 2, 3], [2, 3, 4] and [1, 2, 3, 4] itself.
將包含大于等于三個元素且任意相鄰兩個元素之間的差相等的數組成為等差數列。現在輸入一個隨機數組,問該數組中一共可以找出多少組等差數列。
思路一:動態規劃假設已經知道以第i-1個數字為結尾有k個等差數列,且第i個元素與i-1號元素和i-2號元素構成了等差數列,則第i個數字為結尾的等差數列個數為k+1。因此我們可以自底向上動態規劃,記錄每一位作為結尾的等差數列的個數,并最終得出整個數列中等差數列的個數。代碼如下:
public int numberOfArithmeticSlices(int[] A) { int[] dp = new int[A.length]; int count = 0; for(int i = 2 ; i思路二:算數方法 首先看一個簡單的等差數列1 2 3, 可知該數列中一共有1個等差數列
再看1 2 3 4, 可知該數列中一共有3個等差數列,其中以3為結尾的1個,以4為結尾的2個
再看1 2 3 4 5, 可知該數列中一共有6個等差數列,其中以3為結尾的1個,4為結尾的2個,5為結尾的3個。綜上,我們可以得出,如果是一個最大長度為n的等差數列,則該等差數列中一共包含的等差數列個數為(n-2+1)*(n-2)/2,即(n-1)*(n-2)/2。
因此,我們只需要找到以當前起點為開始的最長的等差數列,計算該等差數列的長度并根據其長度得出其共包含多少個子等差數列。
代碼如下:
public int numberOfArithmeticSlices2(int[] A) { if(A.length <3) return 0; int diff = A[1]-A[0]; int left = 0; int right = 2; int count = 0; while(right < A.length) { if(A[right] - A[right-1] != diff) { count += (right-left-1) * (right-left-2) / 2; diff = A[right] - A[right-1]; left = right-1; } right++; } count += (right-left-1) * (right-left-2) / 2; return count; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74259.html
摘要:復雜度思路找數組里面的等差數列的個數。想法是如果一開始三個數就滿足是等差數列的話,就在當前已有的數目上不斷的累加的結果。 Leetcode[413] Arithmetic Slices A sequence of number is called arithmetic if it consists of at least three elements and if the diffe...
摘要:這個題沒什么好說的,用棧就可以了,注意一下兩個數計算的時候誰前誰后就行了。 Evaluate Reverse Polish Notation https://oj.leetcode.com/problems/evaluate-reverse-polish-notation/ Evaluate the value of an arithmetic expression in Reve...
Problem Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, *, /. Each operand may be an integer or another expression. Note: Division between two inte...
摘要:棧法復雜度時間空間思路逆波蘭表達式的計算十分方便,對于運算符,其運算的兩個數就是這個運算符前面的兩個數。注意對于減法,先彈出的是減號后面的數。 Evaluate Reverse Polish Notation Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operato...
摘要:我們一般看到的數學表達式就是中綴表達式,也就是將符號放在兩個數字之間。后綴表達式也就是將運算符放在相應數字的后面。后綴表達式相當于樹中的后序遍歷。通過獲得對應位置的操作符。如果對應的還是操作符,則繼續遞歸往前計算。 題目要求 Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid...
閱讀 870·2021-09-02 09:55
閱讀 1495·2019-12-27 12:02
閱讀 1684·2019-08-30 14:24
閱讀 1138·2019-08-30 14:18
閱讀 2750·2019-08-29 13:57
閱讀 2193·2019-08-26 11:51
閱讀 1364·2019-08-26 10:37
閱讀 763·2019-08-23 16:09