• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Uriel's Corner

            Research Associate @ Harvard University / Research Interests: Computer Vision, Biomedical Image Analysis, Machine Learning
            posts - 0, comments - 50, trackbacks - 0, articles - 594
            給定一列數,如果三個或以上的數滿足等差數列定義,則稱為arithmetic subsequences,問給定的一列數有多少個arithmetic subsequences
            1  <= nums.length <= 1000
            -231 <= nums[i] <= 231 - 1
            這題按照思路來說,大概是Medium難度的DP,用python也特別方便好寫,于是閑聊無視非要用C寫了一遍,就真的變Hard模式了,搞了n次才AC,發現果然沒有別人用C來寫。。= =||
            總的思路:dp[i][dif]保存處理到第i個數,且相鄰數差值為dif的子數列個數,dp更新:
            for i in range(len(nums)):
               for j in range(i):
                  dif = nums[j] - nums[i]
                  dp[i][dif] += dp[j][dif] + 1
                  ans += dp[j][dif]

            Python很好寫,用dict保存所有可能的dif值就行:

             1 #446
             2 #Runtime: 2028 ms
             3 #Memory Usage: 74.3 MB
             4 
             5 class Solution(object):
             6     def numberOfArithmeticSlices(self, nums):
             7         """
             8         :type nums: List[int]
             9         :rtype: int
            10         """
            11         dp = [defaultdict(int) for _ in range(len(nums))]
            12         ans = 0
            13         for i in range(len(nums)):
            14             for j in range(i):
            15                 dif = nums[j] - nums[i]
            16                 dp[i][dif] += dp[j][dif] + 1
            17                 ans += dp[j][dif]
            18         return ans


            C語言版,思路同上,但因為C里面沒有好用的dict,所以用了Hash,LeetCode支持uthash,另外如果直接hash,那么dif的可能性會非常大(cnt保存所有dif的可能性數量),dp數組沒法開那么大,于是,只保存真的形成了3個或以上數字的等差數列的dif值(用cnt2來保存符合這樣條件的dif值的數量),在開dp數組的時候第二維開多大也有一點小trick
            交上去的結果:
            Runtime: 799 ms, faster than 100.00% of C online submissions for Arithmetic Slices II - Subsequence.
            Memory Usage: 240.9 MB, less than 100.00% of C online submissions for Arithmetic Slices II - Subsequence.
            Accepted Solutions Runtime Distribution
            Sorry. We do not have enough accepted submissions to show distribution chart.
            Accepted Solutions Memory Distribution
            Sorry. We do not have enough accepted submissions to show distribution chart.
            Invite friends to challenge Arithmetic Slices II - Subsequence
             1 //446
             2 //Runtime: 799 ms
             3 //Memory Usage: 240.9 MB
             4 
             5 struct hashTable {
             6     long long key;
             7     int val;
             8     int init;
             9     UT_hash_handle hh;
            10 };
            11 
            12 struct hashTable* dict;
            13 
            14 struct hashTable* find(long long k) {
            15     struct hashTable* t;
            16     HASH_FIND(hh, dict, &k, sizeof(long long), t);
            17     return t;
            18 }
            19 
            20 int min(int a, int b) {
            21     return a<b?a:b;
            22 }
            23 
            24 void insert(long long k, int v, int id) {
            25     struct hashTable* t = malloc(sizeof(struct hashTable));
            26     t->key = k;
            27     t->val = v;
            28     t->init = id;
            29     HASH_ADD(hh, dict, key, sizeof(long long), t);
            30 }
            31 
            32 int numberOfArithmeticSlices(int* nums, int numsSize){
            33     int ans = 0;
            34     int cnt = 0;
            35     int idx[numsSize*numsSize];
            36     int cnt2 = 0;
            37     int dp[numsSize][min(numsSize*numsSize,(int)10000000/numsSize)];
            38     memset(dp, 0, sizeof(dp));
            39     memset(idx, -1, sizeof(idx));
            40     dict = NULL;
            41     for(int i = 0; i < numsSize; ++i) {
            42         for(int j  = 0; j < i; ++j) {
            43             long long dif = (long long)nums[j] - (long long)nums[i];          
            44             struct hashTable* it = find(dif);
            45             if(it == NULL) {
            46                 insert(dif, cnt, i);                
            47                 ++cnt;
            48             }
            49             else {
            50                 if(idx[it->val] == -1) {
            51                     idx[it->val] = cnt2;
            52                     dp[it->init][cnt2] = 1;
            53                     dp[i][cnt2] += dp[j][cnt2] + 1;
            54                     ans += dp[j][cnt2];
            55                     ++cnt2;
            56                 }
            57                 else {
            58                     dp[i][idx[it->val]] += dp[j][idx[it->val]] + 1;
            59                     ans += dp[j][idx[it->val]];
            60                 }
            61             }
            62             
            63         }
            64     }
            65     return ans;
            66 }

            狠狠色丁香婷婷综合久久来| 大美女久久久久久j久久| 久久久无码精品亚洲日韩蜜臀浪潮| 韩国三级中文字幕hd久久精品| 四虎久久影院| 久久精品国产亚洲77777| 国产真实乱对白精彩久久| 久久精品国产清自在天天线 | 亚洲国产成人久久综合碰| 久久笫一福利免费导航| 久久精品亚洲一区二区三区浴池| 国产一区二区三精品久久久无广告| 亚洲国产精品无码久久一线| 97久久精品人妻人人搡人人玩| 99热热久久这里只有精品68| 狠狠色狠狠色综合久久| 国产精品久久久久久久午夜片| 久久精品国产清自在天天线| 日本加勒比久久精品| 国产激情久久久久影院| 成人妇女免费播放久久久| 伊人久久无码中文字幕| 久久伊人精品青青草原日本| 亚洲国产精品一区二区久久| 久久精品国产亚洲AV无码偷窥| 久久国内免费视频| 亚洲精品tv久久久久| 久久久久99精品成人片三人毛片| 久久精品国产精品青草 | 久久精品一区二区| 久久婷婷午色综合夜啪| 四虎影视久久久免费| 久久久久久久国产免费看| 色偷偷888欧美精品久久久| 久久精品国产亚洲AV高清热 | 久久无码人妻一区二区三区| 欧美日韩精品久久久免费观看 | 久久青青草原国产精品免费| 久久精品亚洲中文字幕无码麻豆| 欧美黑人又粗又大久久久| 久久天天躁狠狠躁夜夜2020一 |