九章演算法第七課,兩根指標 TwoSum問題

2021-09-10 14:42:06 字數 2772 閱讀 2987

539. 移動零

class solution 

//找到第乙個是0的位置;

int i;

for (i=0;i415. 有效回文串

注意兩個內建函式的用法:

transform(字串頭,字串尾,新字串頭,::tolower||::toupper)

isalnum(char)

class solution

};

31. 陣列劃分

注意最後i和j的位置需要判斷一下;

class solution 

int helper(vector&nums,int start,int end,int k)

}//i,j的位置有兩種可能,一種是錯開,一種是重合,分情況討論。

//不管是錯開還是重合,都要保證右邊的邊界進右邊部分,左邊的部分進左邊部分。

//如果左右都不是,說明j和i錯開了,中間那個就是要找的值。

if (k<=j-start+1) return helper(nums,start,j,k);

if (k>=i-start+1) return helper(nums,i,end,k-(i-start));

return nums[j+1];

}};

373. 奇偶分割陣列

也是利用快排思想,但是不涉及到二次劃分陣列,所以不需要考慮會不會分不開的問題。

class solution 

};

148. 顏色分類

最簡單的方法是for兩邊遍,第一遍記錄個數,第二遍賦值。如果只能for一遍則需要使用指標的演算法,注意邊界條件和指標移動條件。

class solution 

else if (nums[k]==1) k++;

else if (nums[k]==2) }}

};

143. 排顏色 ii

class solution 

void sort(vector&colors,int start,int end,

int colorsfrom, int colorsto)

}//排完之後j在左邊,i在右邊,需要縮小範圍

sort(colors,start,j,colorsfrom,mid);

sort(colors,i,end,mid+1,colorsto);

}};

烙餅排序

烙餅排序最簡單的想法類似漢諾塔,先排好最下面的,然後排倒數第二個...最少操作兩次就可以排好乙個位置(假設要排第n個餅,餅位於x,則先將x以上的餅全部反轉,x反轉到最上面,然後再將n個餅反轉)。加上最後兩個餅只需要一次就能排好位置,因此最多2n-3次即可排好所有烙餅。

如果想減少反轉次數找到最優解,只能通過搜尋+剪枝的方法,動歸等被證明不可以。

搜尋即搜尋所有可能的操作,記錄達到有序一共需要的次數,但是時間複雜度會變的很高,因此需要剪枝。

剪枝即尋找提前出口的條件:

1.操作已超過2n-3次還沒排好序;

2.已經排好序;

3.已經操作的次數+將要操作的次數大於2n-3次。由於每次操作只能使兩個使乙個烙餅與大小和它相鄰的烙餅排到一起,因此想要有序最少的操作次數計算如下:

lowerbound = 0;

for(index = 0; index < size - 1; index ++)

4.上次剛反轉完,同乙個餅,則不操作。

if(index == lastindex) continue;
5.快取從初始狀態將到當前狀態過程中的所以狀態,然後搜尋當前狀態是否在快取**現過,如果出現過則退出。將之前的狀態變成hashkey儲存,在本狀態退出之後需要刪除此狀態的hashkey。 

睡眠排序、麵條排序、猴子排序,其中猴子排序用了隨機洗牌演算法,以及生成隨機數

607. 兩數之和 iii-資料結構設計

注意考慮重複數字的問題,使用unordered_multimap。map、set都是使用紅黑樹實現的,而unordered_map、unordered_set才是雜湊表實現的,multi表明可以有重複。

class twosum 

bool find(int value)

else if (hash.count(value-n)>=1) return true;

}return false;

}};

608. 兩數和 ii-輸入已排序的陣列

class solution 

return res;

}};

443. 兩數之和 ii

指標反過來移動即可。

class solution 

if (nums[i]+nums[j]<=target) i++;

}return res;

}};

533. 兩數和的最接近值

因為i和j都是貼著最可能接近target的位置移動的,所以ij也都不回頭。

class solution 

else

if (flag==0) twosum[numbers[i]+numbers[j]].push_back(make_pair(i,j));}}

for (int i=0;isum.first && i>sum.second)

}};

C語言第七課

主要內容 結構體 很重要,掌握 一 結構體的宣告 結構體是一種比較靈活的資料型別,與oc要學的類很相似 結構體是一種自己定義的資料型別示例 struct 結構體名 student 定義乙個學生型別 由結構體型別修飾的變數,叫結構體變數 定義 struct 結構體名 變數名 示例 struct stu...

第七課 C變數

第七課c變數 7.1 c 變數介紹 變數是程式可操作的儲存區的名稱。c 中每個變數都有特定的型別,型別決定了變數儲存的大小和布局,該範圍內的值都可以儲存在記憶體中,運算子可應用於變數上。變數的名稱可以由字母 數字和下劃線字元組成。它必須以字母或下劃線開頭。大寫字母和小寫字母是不同的,因為c 是大小寫...

python第七課(集合)

set 集合是乙個無序不重複元素的集合 無序唯一 支援 union 聯合 intersection 交 difference 差 和 sysmmetric difference 對稱差集 等數 算 建立語法 set1 set 空 set1 set1 set 字典將取key key 唯一 set1 s...