leetcode 457 (最不同意的題目!?)感想+吐槽

1.解法與解析

1.1 注意事項

  • circle裏的元 素方向一致,「Furthermore, movements in a cycle must all follow a single direction.」
  • 檢驗不是index0開頭的路徑就能夠,須要檢驗全部index開頭的路徑

1.2 解

bool circularArrayLoop(int* nums, int numsSize){
    for (int i = 0; i < numsSize; i++) {
        nums[i] %= numsSize;    //normalization
    }
    for (int i = 0; i < numsSize; i++) {
        int direction = nums[i] > 0;
        for (int j = i; nums[j] < numsSize && direction == nums[j] > 0;) {
            int temp_j = j;
            j = (j + numsSize + nums[j]) % numsSize; // j = j_next
            if (nums[j] == numsSize + i) {  //是否本輪走過
                return true;
            }
            nums[temp_j] = numsSize + i;    //標記腳印
        }
    }
    return false;
}
複製代碼

1.3 解析

  • 判斷是否有circle,能夠使用fast和slow雙指針,也能夠標記走過的腳印,考慮到「注意事項」中第二點,此處標記腳印時間複雜度會更少 link
  • j = j_next 表達式爲j = (j + numsSize + nums[j] % numsSize) % numsSize;
  • 考慮j = (j + numsSize + nums[j] % numsSize) % numsSize;j = (j + numsSize + nums[j]) % numsSize;的計算量,標準化(normalization)是須要的
  • 長度爲1的去除,通常能夠用j != j_next,此處用到的是,nums[j] < numsSize(nums[j] == numsSize + i)的returnnums[temp_j] = numsSize + i;的結合,規避了長度爲1的狀況

2. 總結

一、不是o(1)extra對應的就是fast和slow
二、能不能改原數據不是定死的,需靈活變化
2.一、必要的預處理很重要,常見的預處理有:排序,標準化
三、空間複雜度的o(1)不是1一個變量的空間,指的是固定常量的空間
3.一、同上,時間複雜度o(n)不必定指的就是單個循環,是o(2n)、o(3n)的統稱;
四、時間複雜度o(n²)和h循環嵌套循環不徹底等價,裏層循環與外面的循環互斥,也可認爲o(n)
五、不要太拘泥於形式,leetcode上面的時間、內存斷定也有偏差,在答案相同時,不須要在0、4ms時間消耗上,0.一、0.2m空間消耗上作文章
複製代碼

projectgit

3. Extra(吐槽篇)

  • 本題不是考解法,更重要的考認真讀題😂😂,舉個栗子:爲何{3,1,2}能夠?爲何{0,1,2}不能夠;爲何{1, 2, 3, 4, 5}能夠?爲何{-2, 1, -1, -2, -2}不能夠;
相關文章
相關標籤/搜索