第一題是每日一題的簡單題。需要記的並不多,一是用迭代器對vector的一些基本操作。可以參考這裡
for(vector::iterator iter=num.begin();iter!=num.end();iter++)
}另外是快排的思想。這種思想實用性很廣,即使不需要排序,在找出最大的k個數,對陣列進行分割(以中間點為基準)等可以大大降低時間複雜度。下面是找出最大的k個數的快排思想:
定義函式 random_select(left, right, k) 表示劃分陣列points 的 [left,right] 區間,並且需要找到其中第 k個距離最小的點。在一次劃分操作完成後,設 pivot 的下標為 i,即區間 [left,i−1] 中的點的距離都小於等於pivot,而區間 [i+1,right] 的點的距離都大於pivot。此時會有三種情況:
如果 k =i−left+1,那麼說明 \textitpivot 就是第 kk 個距離最小的點,我們可以結束整個過程;
如果 k < i−left+1,那麼說明第 k 個距離最小的點在 pivot 左側,因此遞迴呼叫 random_select(left, i - 1, k);
如果 k > i−left+1,那麼說明第 k 個距離最小的點在pivot 右側,因此遞迴呼叫 random_select(i + 1, right, k - (i - left + 1))。
在整個過程結束之後,第 k 個距離最小的點恰好就在陣列 points 中的第 k 個位置,並且其左側的所有點的距離都小於它。此時,我們就找到了前 k 個距離最小的點。
ascii要記住數字是48,字母是64和96。
十分慚愧,本以為一步貪心可以解決。。。寫完發現還是要列舉。。注意下比較儲存整型數的string大小,不需要stoi後再比較,可以直接用strcmp比較,因為字串可能以「0」開頭,無法轉成整形。
下面給出力扣的題解。。。
class solution
public:
string findlexsmalleststring(string s, int a, int b)
}if (added)
for (int i = pos; i < n; i += 2)
p[i] = '0' + (p[i] - '0' + added) % 10;
};// rotate操作
for (int i = 0; i < n; i += gb)
return ans;
}這裡看到資料量不大,我選擇了桶排序,但題目要求不使用額外空間,這點並沒有做到。以後資料量小要記得使用桶排序。
下面是力扣題解,時間和空間消耗都很小:
若要不占用額外空間,就要修改原本的資料,這點是應該想到的。如果想到這裡再分析一下結合題目的條件「1 ≤ a[i] ≤ n ,數字只出現兩次或一次」也是乙個向這個解法引導的思路。
力扣刷題記錄05
題目分類 二分查詢 時間 2020 09 09 題目一 兩數之和 兩數之和 ii 輸入有序陣列 給定乙個已按照公升序排列 的有序陣列,找到兩個數使得它們相加之和等於目標數。函式應該返回這兩個下標值 index1 和 index2,其中 index1 必須小於 index2。說明 返回的下標值 ind...
力扣刷題記錄10
三角形的最大周長 看到這個題目,我想到了排序後從最大的中挑選,但遇到了點困難,一方面是無法記錄哪個是最大的點,這樣每次都要判斷。另一方面是根據題目要求,每個數只能用一次,要記錄下當前哪些是已經被使用了的。看到題解之後感覺自己是個智障。class solution return0 下次貪心時候也要動動...
力扣刷題記錄11
有幾天沒有寫力扣了,這幾天事情實在有點多。聽了幾場就業的經驗分享,仔細想了一下自己的情況,決定放棄考研,去找個工作了。目標 寒假好好學習 春天找個好點的實習 秋招找個好點的工作。加油吧 後面刷力扣會多做點題目,每天兩個簡單題找手感。這個題目沒什麼說的,就是幾次遍歷。第一次算出所有元素和,然後存下來元...