算法(六)-數(shù)組

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)度后面的元素。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 數(shù)組中重復(fù)的數(shù)字(一維數(shù)組) 問(wèn)題:在一個(gè)長(zhǎng)度為長(zhǎng)度為n的數(shù)組里的所有數(shù)字都在0-n-1之間。找出任意一個(gè)重復(fù)的數(shù)...
    Drama_Du閱讀 1,248評(píng)論 0 0
  • 1. 找出數(shù)組中重復(fù)的數(shù)字 題目:在一個(gè)長(zhǎng)度為n的數(shù)組里的所有數(shù)字都在0到n-1的范圍內(nèi)。數(shù)組中某些數(shù)字是重復(fù)的,...
    BookThief閱讀 2,025評(píng)論 0 2
  • 1.把二元查找樹(shù)轉(zhuǎn)變成排序的雙向鏈表 題目: 輸入一棵二元查找樹(shù),將該二元查找樹(shù)轉(zhuǎn)換成一個(gè)排序的雙向鏈表。 要求不...
    曲終人散Li閱讀 3,520評(píng)論 0 19
  • 數(shù)組是最簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu),占據(jù)連續(xù)內(nèi)存并且按順序存儲(chǔ)。 以下是與數(shù)組有關(guān)的算法題目。 (1)查詢數(shù)組中重復(fù)數(shù)字 算法...
    頑皮的石頭7788121閱讀 2,189評(píng)論 0 0
  • 第六章 風(fēng)憂輕輕嘆了一口氣,看著眼前的青銅大鐘,緩緩收起了長(zhǎng)劍。 “一直聽(tīng)說(shuō)東皇鐘的防御能力獨(dú)步天下,現(xiàn)在一看,果...
    書生幺閱讀 292評(píng)論 0 0

友情鏈接更多精彩內(nèi)容