給你一個數組 nums 和一個值 val,你須要 原地 移除全部數值等於 val 的元素,並返回移除後數組的新長度。java
不要使用額外的數組空間,你必須僅使用 O(1) 額外空間並 原地 修改輸入數組。數組
元素的順序能夠改變。你不須要考慮數組中超出新長度後面的元素。函數
示例 1:指針
給定 nums = [3,2,2,3], val = 3,code
函數應該返回新的長度 2, 而且 nums 中的前兩個元素均爲 2。排序
你不須要考慮數組中超出新長度後面的元素。索引
示例 2:element
給定 nums = [0,1,2,2,3,0,4,2], val = 2,leetcode
函數應該返回新的長度 5, 而且 nums 中的前五個元素爲 0, 1, 3, 0, 4。rem
注意這五個元素可爲任意順序。
你不須要考慮數組中超出新長度後面的元素。
來源:力扣(LeetCode)
連接:https://leetcode-cn.com/problems/remove-element
定義雙指針,一個慢指針、一個快指針;
注意昨天的那道移除重複元素的題也用到雙指針,可是那道題的j從1開始判斷(由於要刪除重複出現的元素,因此第一個值不須要遍歷);本題則須要j從第一個開始判斷是否有與目標值相等的值,假若不等,則修改i索引下的值,慢指針i+1;
class Solution { public int removeElement(int[] nums, int val) { // 採用雙指針法(快慢指針)----》另一種指針 int i = 0; int j = 0; for (; j < nums.length; j++) { if (nums[j] != val){ nums[i] = nums[j]; i++; } } return i; } }
給定一個排序數組和一個目標值,在數組中找到目標值,並返回其索引。若是目標值不存在於數組中,返回它將會被按順序插入的位置。 你能夠假設數組中無重複元素。 示例 1: 輸入: [1,3,5,6], 5 輸出: 2 示例 2: 輸入: [1,3,5,6], 2 輸出: 1 示例 3: 輸入: [1,3,5,6], 7 輸出: 4 示例 4: 輸入: [1,3,5,6], 0 輸出: 0
來源:力扣(LeetCode)
連接:https://leetcode-cn.com/problems/search-insert-position
利用二分查找
能夠套用二分查找模板來具體實現。
分別定義變量:左指針、右指針、中間指針(mid);當中間指針的位置數據 < target 則左指針在中間指針基礎上+1;當中間指針的位置數據 > target 則右指針在中間指針基礎上-1;相等則返回中間指針位置,證實在數組中找到target值的位置。 若是沒有找到,left>right 則跳出循環,返回的left指針的位置爲target在數組中的插入位置,知足題意的完整性!
class Solution { public int searchInsert(int[] nums, int target) { // 二分查找 int left = 0; int right = nums.length - 1; int mid; while (left <= right){ mid = (left + right)/2; if(nums[mid] == target){ return mid; }else if (nums[mid] < target){ left = mid + 1; }else{ right = mid - 1; } } return left; } }
ps:開始想採用昨天第一題(兩數求和等於目標值)設定Map集合的方法獲取目標值所在數組中的位置,可是發現題中強調:若是目標值不存在於數組中,返回它將會被按順序插入的位置。 所以按照Map集合的方法沒法實現,採用二分查找是正確的選擇!