首页 > 其他分享 >代码随想录-数组理论基础

代码随想录-数组理论基础

时间:2023-02-19 17:12:14浏览次数:49  
标签:right nums int 代码 随想录 mid 数组 left

数组理论基础

二分查找

代码随想录 (programmercarl.com)

二分查找前提条件:有序数组且无重复元素,想好是用左闭右闭还是左闭右开!

  • 如果是前者,while(left <= right),left==right是有意义的,后续if(nums[middle] > target),right要赋值为middle-1,因为当前的middle已经判断不等于,所以接下来查找的区间为middle-1
  • 如果是后者,while(left < right), left==right无意义,后续的比较right就可以更新为middle,即:下一个查询区间不会去比较nums[middle]
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

示例 1:
输入: nums = [-1,0,3,5,9,12], target = 9     
输出: 4       
解释: 9 出现在 nums 中并且下标为 4     
// 采用left <= right
public int search(int[] nums, int target){
        // 比较首尾提前判断
        if (target < nums[0] || target > nums[nums.length - 1]) {
            return -1;
        }
        int left = 0, right = nums.length-1;
        // left < right
        while (left <= right) {
            // 位运算,相当于/2
            int mid = left + ((right - left) >> 1);
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] < target) {
                // left = mid;
                left = mid + 1;
            } else if (nums[mid] > target) {
                // right = mid;
                right = mid - 1;
            }
        }
        return -1;
    }

移除元素(暴力&双指针)

代码随想录 (programmercarl.com)

要知道数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖(从后往前移)。

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并**原地**修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。
// 暴力
public static int solution(int[] nums, int val) {
        // 定义数组长度,用于后续删减
        int size = nums.length;
        for (int i = 0; i < size; i++) {
            // 如果是目标数则将后续元素向前移,同时减掉i和size的数值
            if (nums[i] == val) {
                for (int j = i + 1; j < size; j++) {
                    nums[j - 1] = nums[j];
                }
                i--;
                size--;
            }
        }
        return size;
    }

// 快慢指针
public static int removeElement(int[] nums, int val) {
        int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < nums.length; fastIndex++) {
            // 如果是目标数的话,只增加fast,反之两者都加,最后取slow
            if (nums[fastIndex] != val) {
                nums[slowIndex] = nums[fastIndex];
                slowIndex++;
            }
        }
        return slowIndex;
    }

标签:right,nums,int,代码,随想录,mid,数组,left
From: https://www.cnblogs.com/junun/p/17135082.html

相关文章

  • 第三章 字符串、向量和数组
    第三章字符串、向量和数组using声明使用某个命名空间:例如usingstd::cin表示使用命名空间std中的名字cin。头文件中不应该包含using声明。这样使用了该头文件的源码......
  • 人工智能五子棋游戏——(6)完整的项目代码
    本项目使用的是JavaScript语言,用到了其中的jquery库的jquery-2.2.2.min版本,请自行网上下载,本文就不再给出。 (1)前端html文件index.html1<!DOCTYPEhtml>2<html>......
  • python代码规范PEP8
    1、引言本文档给出了Python编码规约,主要Python发行版中的标准库即遵守该规约。对于C代码风格的Python程序,请参阅配套的C代码风格指南。本文档和PEP257(文档字......
  • 华为OD机试 - 寻找相似单词(Java 代码实现)
    题目描述给定一个可存储若干单词的字典,找出指定单词的所有相似单词,并且按照单词名称从小到大排序输出。单词仅包括字母,但可能大小写并存(大写不一定只出现在首字母)。相似......
  • golang 数组
    1.概念golang中的数组是具有固定长度及相同数据类型的序列集合2.初始化数组var数组名[数组大小]数据类型packagemainimport"fmt"funcmain(){ //第一种 v......
  • 【算法】数组的前缀和 Prefix Sum
    算法中有前缀和这样一种很好的数据结构,它能极大地降低区间查询的时间复杂度前缀和-PrefixSum 它是这样的,假如有这样一个数组(序列), A=[a1,a2,a3,a4,a5,a6,......
  • 4. 寻找两个正序数组的中位数
    给定两个大小分别为m和n的正序(从小到大)数组 nums1和 nums2。请你找出并返回这两个正序数组的中位数。算法的时间复杂度应该为O(log(m+n))。 题解:采用了遍......
  • js代码按块编译
    1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<title>js代码按块编译</title>6</head>7<body>8910<script>1......
  • 代码随想录打卡第4天 |两两交换链表中的节点,删除链表的倒数第N个节点,链表相交,环形链表
    两两交换链表节点1,三指针 pre指向要交换的两点之前,cur指向一节点,temp指向下一节点 2,交换完时while(pre.next!=null&&pre.next.next!=null)删除倒数......
  • F - 树状数组 2【GDUT_22级寒假训练专题五】
    F-树状数组2原题链接思路在树状数组1中我们可以得知单点修改,区间查询(区间和)对原数组进行单点修改,对区间和进行树状数组维护利用差分和前缀和我们可以推导出区......