704.二分查找
遞歸
public static int binarySearch(int[] arr, int target, int low, int high) {
if (arr == null || arr.length == 0) {
return -1;
}
int middle = (low + high) / 2;
if (target > arr[middle]) {
return binarySearch(arr, target, middle + 1, high);
} else if (target < arr[middle]) {
return binarySearch(arr, target, low, middle - 1);
} else {
return middle;
}
}
非遞歸
public static int binarySearch2(int[] arr, int target) {
if (arr == null || arr.length == 0) {
return -1;
}
int low = 0;
int high = arr.length - 1;
while (low < high) {
int mid = (low + high) / 2;
if (target > arr[mid]) {
low = mid + 1;
} else if (target < arr[mid]) {
high = mid - 1;
} else {
return mid;
}
}
return -1;
}
數(shù)組奇偶分離
1,2,3,5,4
要求:奇數(shù)排左邊,偶數(shù)排右邊,且奇數(shù)偶數(shù)內(nèi)部順序不變。時(shí)間復(fù)雜度o(n),空間復(fù)雜的o(1).
結(jié)果:1,3,5,2,4
public static void oddEvenSeparation(int[] arr) {
for (int i = 0; i < arr.length; i++) {
//當(dāng)前數(shù)為偶數(shù),下一個(gè)數(shù)為奇數(shù)
if (arr[i] % 2 == 0 && i + 1 < arr.length && arr[i + 1] % 2 != 0) {
//如果滿足上一個(gè)數(shù)為偶數(shù),那下一個(gè)數(shù)直接與上一個(gè)數(shù)交換
if (i - 1 >= 0 && arr[i - 1] % 2 == 0) {
int tmp = arr[i - 1];
arr[i - 1] = arr[i + 1];
arr[i + 1] = tmp;
}
//交換完,當(dāng)前數(shù)再與下一個(gè)數(shù)交換
int tmp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = tmp;
}
}
}
283. 移動(dòng)零
給定一個(gè)數(shù)組 nums,編寫一個(gè)函數(shù)將所有 0 移動(dòng)到數(shù)組的末尾,同時(shí)保持非零元素的相對(duì)順序。
示例:
輸入: [0,1,0,3,12]
輸出: [1,3,12,0,0]
說(shuō)明:
必須在原數(shù)組上操作,不能拷貝額外的數(shù)組。
盡量減少操作次數(shù)。
思路:設(shè)計(jì)一個(gè)指向零元素的指針,for循環(huán)每次取到非零元素遍與之swap.
變種:如果讓0移動(dòng)到數(shù)組的左邊,那只需從數(shù)組尾部往頭部遍歷即可。
public void moveZeroes(int[] nums) {
int zero = 0;//標(biāo)記零元素指針
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
if (i != zero) {
//swap兩個(gè)元素
int tmp = nums[zero];
nums[zero] = nums[i];
nums[i] = tmp;
}
//index向后移動(dòng)一位
zero++;
}
}
}
27. 移除元素
給定一個(gè)數(shù)組 nums 和一個(gè)值 val,你需要原地移除所有數(shù)值等于 val 的元素,返回移除后數(shù)組的新長(zhǎng)度。
不要使用額外的數(shù)組空間,你必須在原地修改輸入數(shù)組并在使用 O(1) 額外空間的條件下完成。
元素的順序可以改變。你不需要考慮數(shù)組中超出新長(zhǎng)度后面的元素。
示例 1:
給定 nums = [3,2,2,3], val = 3,
函數(shù)應(yīng)該返回新的長(zhǎng)度 2, 并且 nums 中的前兩個(gè)元素均為 2。
你不需要考慮數(shù)組中超出新長(zhǎng)度后面的元素。
...
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int index = 0;
for (int i = 0; i < nums.size(); ++i) {
if (nums[i] != val) {
nums[index++] = nums[i];
}
}
return index;
}
};
26.刪除排序數(shù)組中的重復(fù)項(xiàng)
給定一個(gè)排序數(shù)組,你需要在 原地 刪除重復(fù)出現(xiàn)的元素,使得每個(gè)元素只出現(xiàn)一次,返回移除后數(shù)組的新長(zhǎng)度。
不要使用額外的數(shù)組空間,你必須在 原地 修改輸入數(shù)組 并在使用 O(1) 額外空間的條件下完成。
示例 1:
給定數(shù)組 nums = [1,1,2],
函數(shù)應(yīng)該返回新的長(zhǎng)度 2, 并且原數(shù)組 nums 的前兩個(gè)元素被修改為 1, 2。
你不需要考慮數(shù)組中超出新長(zhǎng)度后面的元素。
示例 2:
給定 nums = [0,0,1,1,1,2,2,3,3,4],
函數(shù)應(yīng)該返回新的長(zhǎng)度 5, 并且原數(shù)組 nums 的前五個(gè)元素被修改為 0, 1, 2, 3, 4。
你不需要考慮數(shù)組中超出新長(zhǎng)度后面的元素。
思路:
|-index
int[] arr = {0, 0, 1, 1, 1, 2, 2, 3, 3, 4};
|-for循環(huán)指針
for循環(huán)指針移動(dòng)到比index元素大時(shí),先index后移一位然后再賦值給index
public int removeDuplicates(int[] nums) {
int index = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[index] < nums[i]) {
index++;
nums[index] = nums[i];
}
}
return index + 1;
}
80. 刪除排序數(shù)組中的重復(fù)項(xiàng) II
給定一個(gè)排序數(shù)組,你需要在原地刪除重復(fù)出現(xiàn)的元素,使得每個(gè)元素最多出現(xiàn)兩次,返回移除后數(shù)組的新長(zhǎng)度。
不要使用額外的數(shù)組空間,你必須在原地修改輸入數(shù)組并在使用 O(1) 額外空間的條件下完成。
示例 1:
給定 nums = [1,1,1,2,2,3],
函數(shù)應(yīng)返回新長(zhǎng)度 length = 5, 并且原數(shù)組的前五個(gè)元素被修改為 1, 1, 2, 2, 3 。
你不需要考慮數(shù)組中超出新長(zhǎng)度后面的元素。
示例 2:
給定 nums = [0,0,1,1,1,1,2,3,3],
函數(shù)應(yīng)返回新長(zhǎng)度 length = 7, 并且原數(shù)組的前五個(gè)元素被修改為 0, 0, 1, 1, 2, 3, 3 。
你不需要考慮數(shù)組中超出新長(zhǎng)度后面的元素。