因为数组是容量有限的,由此联想到了ArrayList,于是先复习了一下list容器的用法。
关于List容器
分类:ArrayList、LinkList (基本没区别,在内存有一点区别)
ArrayList:
创建:List list=new ArrayList();
常用操作:add()添加、remove()删除、size()列表大小、get(i)从列表中获得某个元素(注意代码:)、contains()判断某字符串是否在链表内。
开始做题!
704. 二分查找(简单)
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
思考:二分查找已经忘了,根据题解又重新学了一遍,又巩固了一遍!
自己画图:
代码实现:
package day1; class Solution { public int search(int[] nums, int target) { int left=0; int right=nums.length-1; while (left<=right){ //注意此处,第一次编写时忘了加=,导致数组中只存放一个数时出-1. int mid=(right-left)/2+left; int num=nums[mid]; if(num==target) return mid; else if (num>target) right=mid-1; else left=mid+1; } return -1; } }
总结:记住并背过二分法的代码,这算是很基础的算法了!
27. 移除元素
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1)
额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1:
输入:nums = [3,2,2,3], val = 3 输出:2, nums = [2,2]
思考:这个题个人觉得直接看示例就能够快速了解。其实我第一次做这个题的思绪就是暴力解法。结果这样写出的代码不仅在数组长度上容易犯错,写起来也比其他方法麻烦。借鉴了其他朋友的代码,总结出了以下几种方法。
方法1:覆盖法
可以从0开始,把符合条件的数字覆盖。
代码实现:
方法2:双指针法(重点!)
双指针法就是通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
即将慢指针中的数用快指针中的数逐个覆盖。
代码实现:
class Solution { public int removeElement(int[] nums, int val) { int fast=0,slow=0; for (fast = 0; fast < nums.length;fast++) { if(nums[fast]!=val){ nums[slow]=nums[fast]; slow++; } } return slow; } }
总结:快慢指针法也是一个很重要的方法,需要重点理解。同时遇到处理数组问题时就可以从覆盖、创建新数组储存、指针法这几个角度出发。关于快慢指针法的图解视频在卡哥资料中有,可以经常复习。明天继续冲冲冲!!!