LeetCode 第33場雙周賽 題解

2021-10-23 17:05:21 字數 1839 閱讀 3097

## 題目1:[5479. 千位分隔數](

思路:模擬

簽到題,把整數變為字串,從後向前遍歷,每三位加點即可。

**:

class solution 

reverse(res.begin(), res.end());

return res;

}};

複雜度分析:

簡單遍歷,時間複雜度o(n);

記錄結果字串,空間複雜度o(n)。

思路:字串遍歷

簽到題2。

要求最少的點能到達其他所有點,找到所有入度為0的點即可。

**:

class solution 

vectorres;

for (int i = 0; i < n; ++i)

if (u[i] == 0) res.push_back(i);

return res;

}};

複雜度分析:

遍歷陣列,時間複雜度為o(n);

空間複雜度為o(n)。

思路:簡單遍歷

倒推,求最少的「單個元素減一」和「全部元素除2」的操作次數使得陣列元素全部變為0。

不妨乙個乙個元素考慮:

每乙個元素的減1過程都是單獨進行的,所以如果當前元素是奇數,就必須要進行減一操作,最後需要將所有元素的減一操作次數相加;

而每個元素的除2操作是整個陣列共同進行的,而某乙個元素變成0之後,其他元素再怎麼折騰,不管多少次除2操作都不會對這個元素有影響,所以最後只需要求出所有元素的除二次數的最大值。

**:

class solution  else 

}pos = max(pos, now); // 除2次數

}res += pos;

return res;

}};

複雜度分析:

陣列遍歷,時間複雜度為o(n);

維護兩個變數,空間複雜度為o(1)。

思路:深度優先搜尋

要在二維地圖裡尋找某種不重複路徑,且需要判斷全部路徑中是否有滿足條件(即成環)的路徑,用深度優先搜尋。

判斷環路,說明最後要回到之前遍歷過的某一點,為了防止最後兩個點來回搜尋,要在引數中記錄父節點(即探索當前位置的前乙個位置)。

實現細節:

深搜過程中,首先判斷拓展節點與父節點是否相同,若相同說明搜尋在兩個點來回進行,直接pass掉。

其次判斷拓展節點是否已經遍歷過,若遍歷過且不為父節點,說明找到了之前遍歷過的某一點,滿足成環條件,返回 tru

etrue

true

。若沒有遍歷過,則對拓展節點進行新一次的深度優先搜尋。若所有拓展節點都深搜完成且未找到成環路徑,則返回 fal

se

false

false 。

**:

class solution ;

int dy[4] = ;

bool in_grid(int x, int y)

bool dfs(int x, int y, int fx, int fy, vector>& grid, vector>& visit)

if(in_grid(nx, ny) && grid[nx][ny] == grid[x][y])

if(dfs(nx, ny, x, y, grid, visit)) }}

return false;

}bool containscycle(vector>& grid) }}

}return false;

}};

複雜度分析:

深度優先搜尋,總時間複雜度為o(nm);

維護遍歷過程記錄表,空間複雜度為o(nm)。

leetcode第8場雙周賽

這次雙周賽有意外,第二第三題按照提示返回int會報錯,要返回list 第一題給你乙個字串 s,返回只含 單一字母 的子串個數。示例 1 輸入 aaaba 輸出 8 解釋 只含單一字母的子串分別是 aaa aa a b aaa 出現 1 次。aa 出現 2 次。a 出現 4 次。b 出現 1 次。所以...

leetcode第 24 場雙周賽

給你乙個整數陣列nums。你可以選定任意的正數startvalue 作為初始值。你需要從左到右遍歷nums陣列,並將 startvalue 依次累加上nums陣列中的值。請你在確保累加和始終大於等於 1 的前提下,選出乙個最小的正數作為 startvalue 輸入 nums 3,2,3,4,2 輸出...

leetcode 第27場雙周賽

通過翻轉子陣列使兩個陣列相等 檢查乙個字串是否包含所有長度為k的二進位制子串 課程安排 摘櫻桃 3分 簡單 4分 中等 5分 中等 6分 困難 翻譯下題意,其實就是問我們兩個陣列是否相等,判斷陣列是否相等有很多方法,這邊我直接排序,遍歷一遍看是否有不一樣的元素 陣列排序的複雜度,故為o nlogn ...