算法刷題訓練(2020.9.29)

1.移除元素

給你一個數組 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;
    }
}

2.搜索插入位置

給定一個排序數組和一個目標值,在數組中找到目標值,並返回其索引。若是目標值不存在於數組中,返回它將會被按順序插入的位置。
	你能夠假設數組中無重複元素。

示例 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集合的方法沒法實現,採用二分查找是正確的選擇!

相關文章
相關標籤/搜索