数组练习题之 搜索插入位置

搜索插入位置算法解析
本文详细解析了在排序数组中搜索目标值并确定其插入位置的算法,包括四种特殊情况的处理,以及使用二分查找法优化算法效率的方法。

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5
输出: 2

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-insert-position
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:
1.首先需要确定执行次数 nums.length
2.因为有个目标值,所以用目标值与数组中的数据逐个进行比较,这里在运行期出现了三种情况:
第一种:当目标值小于数组下标为0的时候
第二种:当目标值大于数组中最后一个元素时
第三种:在数组中间搜索插入位置
第四种:当目标值等于数组中某个元素
代码实现:

  class Solution {
        public int searchInsert(int[] nums, int target) {
           for(int i=0;i<nums.length;i++){
               if(target==nums[i]){            //这里对数组中存在相同元素进行判断
                   return i;
               }else  if(target<nums[i]){     //这里对滴三种情况进行判断
                    if(i==0)                        //这里对第一种情况进行判断
                        return 0;
                    return i;   
                 }else if(i+1==nums.length){    //这里对第二种情况进行判断
                      return i+1;
                 }                  
           }
           return -1;
        }
    }

做这道题的时候,条件判断时出现了一个异常,把第二种情况进入进第三种情况的判断条件里面,那么程序执行结果会报错。
执行结果:
通过
显示详情
执行用时 :
1 ms
, 在所有 Java 提交中击败了
78.46%
的用户
内存消耗 :
39.1 MB
, 在所有 Java 提交中击败了
52.00%
的用户

执行用时为 0 ms 的范例:

class Solution {
    public int searchInsert(int[] nums, int target) {
       if(nums.length==0 || nums==null) {
			return 0;
		}
		int min = 0;
		int max = nums.length-1;
		while(min<=max) {
			int mid = (min+max)/2;
			if(nums[mid]==target) {
				return mid;
			}else if(nums[mid]<target){
				min = mid+1;
			}else {
				max = mid-1;
			}
		}
		return min;
    }
}

//这里典范同学用的是传说中的二分查找,我也不知道,没学二分查找。将数组一分为二,如果中间数等于目标数,那么返回中间数mid 如果中间数小于目标数,那么min+1,这相当于往后移了一位,如果中间值小于目标值那么最大值又减去一位,这相当于将数组一位一位的缩小,然后只用中间数与目标值进行比较。这样确实更加明了。给典范同学点赞。

<think>好的,我现在需要处理用户关于Java数组练习题的需求。用户希望得到示例、代码、题目和解析,所以我得先整理相关的资源。首先,看看用户提供的引用内容,引用3提到了数组逆序、插入、杨辉三角、顺序查找、二分查找、数组交集和寻找缺失数字等经典题目。引用4则是一个动态数组练习题,关于合并两个有序数组。用户可能对这类题目感兴趣,需要结合这些内容来生成问题。 接下来,我需要确保回答的结构清晰,符合用户的要求,包括示例代码和解析。可能还需要补充一些常见的数组练习题,比如数组去重、旋转数组、子数组和等,这样内容会更全面。同时,要注意每个题目都要有示例代码和解析,帮助用户理解。 还要检查代码的正确性,比如数组逆序可以通过双指针交换元素,杨辉三角需要正确计算每个位置的数值。合并有序数组的题目需要注意从后向前合并以避免覆盖元素,这点在引用4中提到的问题里很重要,需要详细说明。 另外,用户提到需要生成相关问题,可能需要包括每个练习题的扩展问题,比如时间复杂度的分析、不同解法的比较等。不过根据用户最后的示例,可能只需要列出相关问题,不需要详细展开,所以得在最后添加一个相关问题部分,比如关于优化、应用场景等。 需要确保所有数学公式使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$。虽然当前问题可能涉及数学较少,但如果有比如在查找最大数时计算时间复杂度,可能需要用到。 最后,引用用户提供的站内引用,特别是引用3和4,在回答中适当的位置添加引用标识,例如在提到数组逆序或合并数组时标注[^3][^4]。同时,确保使用中文回答,代码部分语法正确,符合Java规范。 总结步骤: 1. 整理用户提供的引用中的数组练习题。 2. 补充其他常见数组题目,确保多样性。 3. 每个题目给出问题描述、示例代码和解析。 4. 检查代码正确性和格式。 5. 添加相关问题部分。 6. 正确引用站内资料。</think>### Java数组经典练习题与解析 --- #### 1. 数组逆序 **题目**:将数组元素顺序反转。例如,输入$[1,2,3,4,5]$,输出$[5,4,3,2,1]$。 **示例代码**: ```java public static void reverseArray(int[] arr) { int left = 0, right = arr.length - 1; while (left < right) { int temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; left++; right--; } } ``` **解析**:通过双指针从两端向中间遍历,交换元素位置,时间复杂度为$O(n)$[^3]。 --- #### 2. 合并两个有序数组 **题目**:将有序数组`nums2`合并到`nums1`中,确保`nums1`仍有序。假设`nums1`有足够空间(例如初始长度为$m+n$)。 **示例代码**: ```java public void merge(int[] nums1, int m, int[] nums2, int n) { int i = m - 1, j = n - 1, k = m + n - 1; while (j >= 0) { if (i >= 0 && nums1[i] > nums2[j]) { nums1[k--] = nums1[i--]; } else { nums1[k--] = nums2[j--]; } } } ``` **解析**:从后向前填充,避免覆盖`nums1`原有元素,时间复杂度$O(m+n)$。 --- #### 3. 杨辉三角生成 **题目**:生成前$n$行的杨辉三角。例如,$n=5$时输出: ``` [1] [1,1] [1,2,1] [1,3,3,1] [1,4,6,4,1] ``` **示例代码**: ```java public List<List<Integer>> generatePascalTriangle(int n) { List<List<Integer>> result = new ArrayList<>(); for (int i = 0; i < n; i++) { List<Integer> row = new ArrayList<>(); for (int j = 0; j <= i; j++) { if (j == 0 || j == i) { row.add(1); } else { row.add(result.get(i-1).get(j-1) + result.get(i-1).get(j)); } } result.add(row); } return result; } ``` **解析**:每行首尾为$1$,中间元素为上一行相邻两数之和[^3]。 --- #### 4. 寻找缺失的数字 **题目**:在$0$到$n$的数组中查找缺失的一个数。例如,输入$[3,0,1]$,输出$2$。 **示例代码**: ```java public int missingNumber(int[] nums) { int sum = 0, n = nums.length; for (int num : nums) sum += num; return n * (n + 1) / 2 - sum; } ``` **解析**:利用高斯公式计算理论总和,减去实际总和即为缺失值,时间复杂度$O(n)$。 --- #### 5. 数组去重(原地) **题目**:原地删除有序数组中的重复项,返回新长度。例如,输入$[1,1,2]$,输出长度$2$,数组变为$[1,2]$。 **示例代码**: ```java public int removeDuplicates(int[] nums) { if (nums.length == 0) return 0; int k = 0; for (int i = 1; i < nums.length; i++) { if (nums[i] != nums[k]) { nums[++k] = nums[i]; } } return k + 1; } ``` **解析**:双指针法,快指针遍历,慢指针标记非重复位置,时间复杂度$O(n)$。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值