<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
陣列是存放在連續記憶體空間上的相同型別資料的集合,可以通過下標索引的方式獲取到下標下對應的資料。
舉個栗子(字元陣列)~
可以看到:
1、陣列的下標從0開始
2、陣列在記憶體中的地址是連續的
所以在刪除元素時,只能用覆蓋的方式進行。
例如,要刪除下標為2的元素~ 就需要將從2之後的元素依次移到前一個,覆蓋掉要刪除的元素。
所以刪除元素並不是將該元素的空間釋放了,而是將後面的元素移到前面,覆蓋掉要刪除的元素,然後將陣列的長度減去1,就能得到一個看似新的陣列。
在java中,二維陣列的儲存方式如下:
力扣題目連結: 二分查詢
這道題目的前提是有序陣列,因為一旦有重複元素,使用二分查詢法返回的元素下標可能不是唯一的,這些都是使用二分法的前提條件。
二分查詢思想是:
陣列有序的前提下(假設升序),如果陣列中間的值大於要查詢的值,那麼要查詢的元素就不可能在後半部分,因為後半部分的值都大於中間的值,所以通過第一次比較,就可以將範圍縮小一半,後面同理,即時間複雜度降到了O(logN),效率大大提高,當題目中要求查詢元素的時間複雜度為O(logN)時,首先想一想是否能用二分呢?
class Solution { public int search(int[] nums, int target) { // 避免當 target 小於nums[0] nums[nums.length - 1]時多次迴圈運算 if (target < nums[0] || target > nums[nums.length - 1]) { return -1; } int left = 0, right = nums.length - 1; while (left <= right) { int mid = left + ((right - left) >> 1); if (nums[mid] == target) return mid; else if (nums[mid] < target) left = mid + 1; else if (nums[mid] > target) right = mid - 1; } return -1; } }
有的同學可能說了,多餘的元素,刪掉不就得了?但是要知道陣列的元素在記憶體地址中是連續的,不能單獨刪除陣列中的某個元素,只能覆蓋。
例如:給你一個陣列和一個val值,要求刪除陣列中等於val值的元素,怎麼做呢?
思路1:暴力法
我們可以使用兩個for迴圈,當遍歷到等於val值的元素時,就將後面的元素整體往前移一個覆蓋掉要刪除的元素,但是這種做法顯然時間複雜度太高。
class Solution { public int removeElement(int[] nums, int val) { int size = nums.length; for (int i = 0; i < size;i++ ) { if (nums[i] == val) { // 發現需要移除的元素,就將陣列後面集體向前移動一位 for (int j = i + 1; j < size; j++) { nums[j - 1] = nums[j]; } i--; // 因為下標i以後的數值都向前移動了一位,所以i也向前移動一位 size--; } } return size; } }
思路2:雙指標法
分別設設一個快慢指標,slow fast ,兩者一起走,當慢指標遇到要刪除的元素時停下,等待著被刪除(覆蓋);當快指標走到要被留下的元素時,將快指標的元素賦值給慢指標,然後兩指標同時向後走,直到快指標遍歷完整個陣列。
可以這麼理解:定義陣列的新長度newLength ,從0開始,定義一個快指標遍歷陣列 fast,當fast走到要被留下的元素時,說明該元素應該被新增到新陣列中(即被新增到newLength 下標,這裡相當於 newLength 之前的部分陣列看做要返回的新陣列,相當於往這個新陣列裡插入元素)。
class Solution { public int removeElement(int[] nums, int val) { int fast = 0;// 定義一個快指標遍歷陣列 int newLength = 0;// 定義新的陣列長度 while(fast < nums.length){ if(nums[fast] != val){ nums[newLength++] = nums[fast]; } fast++; } return newLength; } }
推薦力扣題目
其他常見陣列的考點很多都是以這兩點為基礎,無非就是對陣列增刪改查,將陣列的查詢和刪除掌握了,就可以開始刷題啦。
到此這篇關於Java 陣列高頻考點分析講解的文章就介紹到這了,更多相關Java 陣列內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45