tag数组-刷题预备知识-0.1 一维数组 + lt.724 寻找数组的中心下标 + lt.35 搜索插入位置 3
数组的随机访问方法
1.1 Leetcode 724 寻找数组的中心下标(easy)
[案例需求]
给你一个整数数组 nums,请编写一个能够返回数组 “中心下标” 的方法。
数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。
如果数组不存在中心下标,返回 -1 。如果数组有多个中心下标,应该返回最靠近左边的那一个。
注意:中心下标可能出现在数组的两端。
示例 1:
输入:nums = [1, 7, 3, 6, 5, 6]
输出:3
解释:
中心下标是 3 。
左侧数之和 (1 + 7 + 3 = 11),
右侧数之和 (5 + 6 = 11) ,二者相等。
示例 2:
输入:nums = [1, 2, 3]
输出:-1
解释:
数组中不存在满足此条件的中心下标。
示例 3:
输入:nums = [2, 1, -1]
输出:0
解释:
中心下标是 0 。
下标 0 左侧不存在元素,视作和为 0 ;
右侧数之和为 1 + (-1) = 0 ,二者相等。
[思路分析]
先计算总的和,右边元素的和=总和-左边元素的和-当前元素,
 所以在实际的计算中, 我们只需要遍历计算出数组的总和sum0, 然后再一次遍历数组, 实现以下功能
 //1. 用i记录当前元素
 //2. 通过加减运算得出右边元素的和
 //3. 比较总和 ?= 左边元素和 + 当前元素和 + 右边元素和
 //4. 记录左边元素的和(为什么这是最后一步, 因为我们一定要记得考虑数组的中间下标为0的情况! 此时 左边元素和为0, 举个栗子: nums=[1,-1,1], 输出0)
[代码实现]
class Solution {    
      public static int pivotIndex(int[] nums) {
        //1. 求出数组总和
        //2. 用i记录当前元素
        //3. 求出i左边元素的和,
        //4. 求出i右边元素的和
        //比较总和 ?= 左边元素和 + 当前元素和 + 右边元素和
        int sum0 = 0;
        int sumLeft = 0;
        int sumRight = 0;
        for(int x : nums){
            sum0 += x;
        }
        if( sum0 - nums[0] == 0) return 0;
        for(int i=0; i<=nums.length-1; i++){
            //判断当前元素的左右是否相等
            int tmp = nums[i];
            //右边元素的和(加减得出)
            sumRight = sum0 - tmp - sumLeft;
            if(sumLeft == sumRight){
                return i;
            }
            //当前元素左边的和
            sumLeft += nums[i];
        }
        return -1;
    }
}

1.2 LeetCode 35 搜索插入位置(easy)
[案例需求]
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 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
[思路分析]
- 返回结果: 索引
- 找到数组的值, 或者找到了第一个比这个数大的数, 返回所在的索引
- 未找到, 返回数组长度
[代码实现]
class Solution {
    public int searchInsert(int[] nums, int target) {
        for(int i=0; i<nums.length; i++){
            
            if( nums[i] == target)
                return i;
            if( nums[i] > target){
                return i;
            }
            if(i== nums.length-1)
                return nums.length;
        }
        return 0;
    }
}

虽然通过了,但是这个求法太low了, 待补充: 二分查找 ✔ ;
一定要先通读一下这篇文章噢: 点我
二分查找补充如下:
class Solution {
    public int searchInsert(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while(left <= right){
            int mid = left + (right - left) / 2;
            
            if(target == nums[mid]) return mid;
            if(target < nums[mid]){
                right = mid - 1;
            }else if(target > nums[mid]){
                left = mid + 1;
            }
        }
        return left;
    }
}
 
                     
                    
                 
                    
                

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号