日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

经典数据结构题目-数组

發(fā)布時(shí)間:2024/1/16 windows 30 coder
生活随笔 收集整理的這篇文章主要介紹了 经典数据结构题目-数组 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

704. 二分查找

  • 解決思路

    • 基于數(shù)組有序的特性,取其中一個(gè)值進(jìn)行比較,即可淘汰該值左邊或右邊的元素,縮小搜索的區(qū)間
    • 使用兩指針標(biāo)記需要遍歷的區(qū)間,取中間值進(jìn)行比較,淘汰左邊或右邊元素,不斷移動(dòng)縮小遍歷的區(qū)間,即可查到
  • 代碼

    public int search(int[] nums, int target) {
            int l = 0;
            int r = nums.length - 1;
            while(l <= r){  // 注意點(diǎn)一
                int mid = l + (r-l)/2;
                if(nums[mid] > target){
                    r = mid - 1; // 注意點(diǎn)二
                }else if(nums[mid] < target){
                    l = mid + 1;
                }else{
                    return mid;
                }
            }
            return -1; 
        }
    
  • 注意點(diǎn)

    • 核心注意點(diǎn):避免漏檢元素
    • 注意點(diǎn)一:while條件中選擇 l <= r 還是 l < r ,取決于 r 的取值;當(dāng) r = num.length時(shí),l 不能 <= r,可能會(huì)溢出
    • 注意點(diǎn)二:當(dāng)選擇 l < r 的判斷時(shí),while中每次搜索的區(qū)間為 [l,r) 。當(dāng)num[mid] > target時(shí),r = mid,不能mid-1。因?yàn)閞所指向的元素在進(jìn)入第二次循環(huán)時(shí),是不會(huì)再與target比較,會(huì)導(dǎo)致漏檢
    • 時(shí)間復(fù)雜度 O(logN) 。總共需要遍歷 log2N次,忽略常數(shù)2。
  • 擴(kuò)展

    • 當(dāng)元素可重復(fù)時(shí),如何定位到與target相等的最小索引

    • public static int search(int[] nums, int target) {
              int l = 0;
              int r = nums.length - 1;
              while(l <= r){
                  int mid = l + (r-l)/2;
                  if(nums[mid] >= target){
                      // 等于target的時(shí)候 右指針繼續(xù)移動(dòng),繼續(xù)尋找最左邊的一個(gè)
                      // 如果已達(dá)最左的一個(gè),再循環(huán)左指針會(huì)移動(dòng),最終會(huì)大于r,取到最左的
                      r = mid - 1;
                  }else if(nums[mid] < target){
                      l = mid + 1;
                  }
              }
              // 會(huì)存在找不到與target相等的情況
              if(nums.length == l || nums[l] != target){
                  return -1;
              }
              return l;
          }
      

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

  • 解決思路

    • 使用快慢指針遍歷,快指針用于判斷是否與上一個(gè)元素重復(fù),慢指針用于記錄下最終有效的數(shù)字
    • 快指針判斷為不重復(fù),慢指針記下來(lái),同時(shí)向前移動(dòng)一位
  • 代碼

        public int removeDuplicates(int[] nums) {
            // 只允許元素出現(xiàn)一次的情況
            int k = 1;
            int fast = k;
            int slow = k; // 注意點(diǎn)一
            while(fast < nums.length){
                if(nums[fast] != nums[fast-k]){ // 注意點(diǎn)二
                    nums[slow] = nums[fast];
                    slow++;
                }
                fast ++;
            }
            return slow;
        }
    
  • 注意點(diǎn)

    • 核心注意點(diǎn):理清快慢指針?lè)謩e的作用
    • 注意點(diǎn)一:快慢指針的起始位置,k <= nums.length時(shí),可以初始化快慢指針在k的位置開(kāi)始遍歷
    • 注意點(diǎn)二:判斷元素是否超過(guò)k個(gè)重復(fù),因?yàn)閿?shù)組有序,如果當(dāng)前元素等于前k個(gè)位置的元素,說(shuō)明超過(guò)了
  • 同類型題目

    • https://leetcode.cn/problems/remove-element/description/
    • https://leetcode.cn/problems/move-zeroes/description/

977. 有序數(shù)組的平方

  • 解決思路

    • 非遞減順序。即遞增但可以重復(fù)
    • 使用雙向指針,比較兩指針指向元素的絕對(duì)值,絕對(duì)值大的計(jì)算平方添加進(jìn)結(jié)果數(shù)組
  • 代碼

     public int[] sortedSquares(int[] nums) {
            int[] res = new int[nums.length];
            int l = 0;
            int r = nums.length-1;
            int index = nums.length - 1;
            while(l <= r){
                if(Math.abs(nums[l]) > Math.abs(nums[r])){
                    res[index] = (int)Math.pow(nums[l],2);
                    l++;
                }else{
                    res[index] = (int)Math.pow(nums[r],2);
                    r--;
                }
                index --;
            }
            return res;
        }
    
  • 注意點(diǎn)

    • 這里空間復(fù)雜度為O(1),不是O(n),因?yàn)榭臻g復(fù)雜度是計(jì)算非答案占用的空間
  • 擴(kuò)展

    • 想再節(jié)省空間的話,可以比較兩個(gè)數(shù)的平方后,進(jìn)行交換,右指針一直往前移即可

    • public int[] SortedSquares(int[] nums) {
          int left = 0;
          int right = nums.length-1;
          int leftR = 0, rightR = 0;
          while(right >= 0){
            leftR = nums[left]*nums[left];
            rightR = nums[right]*nums[right];
            // 左指針的平方比較大,交換到數(shù)組的后面來(lái)
            if(leftR >= rightR){
              nums[left] = nums[right];
              nums[right] = leftR;
            }else{
              nums[right] = rightR;
            }
            right--;
          }
          return nums;
      }
      

總結(jié)

以上是生活随笔為你收集整理的经典数据结构题目-数组的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。