自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

怎么刷算法,leetcode上有哪些經(jīng)典題目

開發(fā) 前端
給你一個(gè) 升序排列 的數(shù)組 nums? ,請你 原地 刪除重復(fù)出現(xiàn)的元素,使每個(gè)元素 只出現(xiàn)一次 ,返回刪除后數(shù)組的新長度。元素的 相對順序 應(yīng)該保持 一致 。然后返回 nums 中唯一元素的個(gè)數(shù)。

合并兩個(gè)有序數(shù)組

給你兩個(gè)按 非遞減順序 排列的整數(shù)數(shù)組 nums1 和 nums2,另有兩個(gè)整數(shù) m 和 n ,分別表示 nums1 和 nums2 中的元素?cái)?shù)目。

請你 合并 nums2 到 nums1 中,使合并后的數(shù)組同樣按 非遞減順序 排列。

注意:最終,合并后數(shù)組不應(yīng)由函數(shù)返回,而是存儲在數(shù)組 nums1 中。為了應(yīng)對這種情況,nums1 的初始長度為 m + n,其中前 m 個(gè)元素表示應(yīng)合并的元素,后 n 個(gè)元素為 0 ,應(yīng)忽略。nums2 的長度為 n 。

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        for (int i = 0; i != n; ++i) {
            nums1[m + i] = nums2[i];
        }
        Arrays.sort(nums1);
    }
}

2.刪除有序數(shù)組中的重復(fù)項(xiàng)

給你一個(gè) 升序排列 的數(shù)組 nums ,請你 原地 刪除重復(fù)出現(xiàn)的元素,使每個(gè)元素 只出現(xiàn)一次 ,返回刪除后數(shù)組的新長度。元素的 相對順序 應(yīng)該保持 一致 。然后返回 nums 中唯一元素的個(gè)數(shù)。

考慮 nums 的唯一元素的數(shù)量為 k ,你需要做以下事情確保你的題解可以被通過:

  • 更改數(shù)組 nums ,使 nums 的前 k 個(gè)元素包含唯一元素,并按照它們最初在 nums 中出現(xiàn)的順序排列。nums 的其余元素與 nums 的大小不重要。
  • 返回 k 。

public int removeDuplicates(int[] nums) {
    if(nums == null || nums.length == 0) return 0;
    int p = 0;
    int q = 1;
    while(q < nums.length){
        if(nums[p] != nums[q]){
            nums[p + 1] = nums[q];
            p++;
        }
        q++;
    }
    return p + 1;
}

3.O(1) 時(shí)間插入、刪除和獲取隨機(jī)元素

實(shí)現(xiàn)RandomizedSet 類:

  • RandomizedSet() 初始化 RandomizedSet 對象
  • bool insert(int val) 當(dāng)元素 val 不存在時(shí),向集合中插入該項(xiàng),并返回 true ;否則,返回 false 。
  • bool remove(int val) 當(dāng)元素 val 存在時(shí),從集合中移除該項(xiàng),并返回 true ;否則,返回 false 。
  • int getRandom() 隨機(jī)返回現(xiàn)有集合中的一項(xiàng)(測試用例保證調(diào)用此方法時(shí)集合中至少存在一個(gè)元素)。每個(gè)元素應(yīng)該有 相同的概率 被返回。

你必須實(shí)現(xiàn)類的所有函數(shù),并滿足每個(gè)函數(shù)的 平均 時(shí)間復(fù)雜度為 O(1) 。

class RandomizedSet {
    HashMap<Integer, Integer> map;
    List<Integer> arr;
    int size;
    Random random;


    public RandomizedSet() {
        arr = new ArrayList<>();
        map = new HashMap<>();
        random = new Random();
        size = 0;
    }


    public boolean insert(int val) {
        if (map.containsKey(val)) {
            return false;
        }
        arr.add(val);
        map.put(val, size);
        size++;
        return true;
    }


    public boolean remove(int val) {
        if (!map.containsKey(val)) {
            return false;
        }
        size--;
        int key = map.get(val);
        int end_val = arr.get(size);
        //交換末尾元素和當(dāng)前元素
        swapArr(key, size);
        swapMap(key, val, size, end_val);
        //刪除末尾的值
        arr.remove(size);
        map.remove(val);
        return true;
    }


    public void swapArr(int l, int r) {
        if (Objects.equals(arr.get(l), arr.get(r))) {
            return;
        }
        int temp = arr.get(l);
        arr.set(l, arr.get(r));
        arr.set(r, temp);
    }


    public void swapMap(int l_key, int l_val, int r_key, int r_val) {
        if (l_key == r_key) {
            return;
        }
        map.put(l_val, r_key);
        map.put(r_val, l_key);
    }


    public int getRandom() {
        int pivot = random.nextInt(size);
        return arr.get(pivot);
    }
}


作者:15066212pp
鏈接:https://leetcode.cn/problems/insert-delete-getrandom-o1/solutions/2392594/yun-xing-shi-jian-22msha-xi-biao-by-1506-5qcx/
來源:力扣(LeetCode)
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

4.反轉(zhuǎn)字符串中的單詞

給你一個(gè)字符串 s ,請你反轉(zhuǎn)字符串中 單詞 的順序。

單詞 是由非空格字符組成的字符串。s 中使用至少一個(gè)空格將字符串中的 單詞 分隔開。

返回 單詞 順序顛倒且 單詞 之間用單個(gè)空格連接的結(jié)果字符串。

注意:輸入字符串 s中可能會存在前導(dǎo)空格、尾隨空格或者單詞間的多個(gè)空格。返回的結(jié)果字符串中,單詞間應(yīng)當(dāng)僅用單個(gè)空格分隔,且不包含任何額外的空格。

class Solution {
    public String reverseWords(String s) {
        StringBuilder builder = new StringBuilder(s);
        builder.reverse();
        int len = 0;
        for (int i = 0; i < builder.length(); i++) {
            if (builder.charAt(i) == ' ') {
                continue;
            }
            int j = i;
            while (j < builder.length() && builder.charAt(j) != ' ') {
                j++;
            }
            if (len > 0) {
                builder.setCharAt(len++, ' ');
            }
            // len + k < j - 1 - k: [0, len + k] 已經(jīng)是正序 && [j - 1 - k, j] 已經(jīng)是正序
            for (int k = 0; k < j - i && len + k < j - 1 - k; k++) {
                swap(builder, len + k, j - 1 - k);
            }
            len += j - i;
            i = j - 1;
        }
        builder.delete(len, builder.length());
        return builder.toString();
    }


    private void swap(StringBuilder builder, int i, int j) {
        char tmp = builder.charAt(i);
        builder.setCharAt(i, builder.charAt(j));
        builder.setCharAt(j, tmp);
    }
}

5.長度最小的子數(shù)組

給定一個(gè)含有 n 個(gè)正整數(shù)的數(shù)組和一個(gè)正整數(shù) target 。

找出該數(shù)組中滿足其總和大于等于 target 的長度最小的 連續(xù)子數(shù)組 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其長度。如果不存在符合條件的子數(shù)組,返回 0 。

我們申請一個(gè)臨時(shí)數(shù)組 sums,其中 sums[i] 表示的是原數(shù)組 nums 前 i 個(gè)元素的和,題中說了 “給定一個(gè)含有 n 個(gè) 正整數(shù) 的數(shù)組”,既然是正整數(shù),那么相加的和會越來越大,也就是sums數(shù)組中的元素是遞增的。我們只需要找到 sums[k]-sums[j]>=s,那么 k-j 就是滿足的連續(xù)子數(shù)組,但不一定是最小的,所以我們要繼續(xù)找,直到找到最小的為止。怎么找呢,我們可以使用兩個(gè) for 循環(huán)來枚舉,但這又和第一種暴力求解一樣了,所以我們可以換種思路,求 sums[k]-sums[j]>=s 我們可以求 sums[j]+s<=sums[k],那這樣就好辦了,因?yàn)閿?shù)組sums中的元素是遞增的,也就是排序的,我們只需要求出 sum[j]+s 的值,然后使用二分法查找即可找到這個(gè) k。

public int minSubArrayLen(int s, int[] nums) {
        int length = nums.length;
        int min = Integer.MAX_VALUE;
        int[] sums = new int[length + 1];
        for (int i = 1; i <= length; i++) {
            sums[i] = sums[i - 1] + nums[i - 1];
        }
        for (int i = 0; i <= length; i++) {
            int target = s + sums[i];
            int index = Arrays.binarySearch(sums, target);
            if (index < 0)
                index = ~index;
            if (index <= length) {
                min = Math.min(min, index - i);
            }
        }
        return min == Integer.MAX_VALUE ? 0 : min;
    }

責(zé)任編輯:武曉燕 來源: java知路
相關(guān)推薦

2020-03-05 15:16:31

代碼算法線程

2019-06-12 10:18:03

GitHub代碼開發(fā)者

2022-02-04 21:56:59

回溯算法面試

2021-04-27 10:02:40

股票數(shù)組代碼

2014-06-06 10:32:11

Linux終端模擬器

2009-03-13 16:49:34

2021-01-18 07:31:52

MySQL LeetCode查詢

2021-05-25 14:10:34

AI 數(shù)據(jù)人工智能

2021-08-11 14:34:10

Linux文件管理器

2021-06-08 10:41:00

Go語言算法

2021-11-12 09:30:46

滑動窗口算法

2021-02-22 07:58:45

算法進(jìn)程調(diào)度

2011-04-20 16:58:33

java排序

2021-11-03 15:01:50

算法開源技術(shù)

2021-01-19 07:02:26

算法數(shù)據(jù)結(jié)構(gòu)堆排序

2015-06-24 09:41:23

Java面試經(jīng)典算法題

2021-09-04 15:37:15

LeetCode算法Pointers

2020-10-29 09:24:50

算法開源工具

2022-02-15 07:26:34

web前端算法題

2022-06-29 16:37:15

算法JS數(shù)組
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號