赞
踩
目录
解题思路:对于一个有序数组来讲,可以利用二分查找来查找数组中某一个元素,此方法又可以分为两个具体的思路(左闭右闭和左闭右开)。
遇到的问题:Java中的浮点数溢出问题以及对位运算不太熟悉。
左闭右闭:
- class Solution {
- public int search(int[] nums, int target) {
- //首先要确定target是在数组nums的大小范围中,否则查找将失去意义
- if(target<nums[0]||target>nums[nums.length-1])
- return -1;
-
- int left = 0;
- int right = nums.length-1;
-
- while(right>=left)
- {
- int mid = left+((right-left)>>1);
- if(nums[mid]>target){
- right = mid-1;
- }else if(nums[mid]<target){
- left = mid+1;
- }else if(nums[mid]==target)
- return mid;
- }
- return -1;
- }
- }
左闭右开:
- class Solution {
- public int search(int[] nums, int target) {
- //首先要确定target是在数组nums的大小范围中,否则查找将失去意义
- if(target<nums[0]||target>nums[nums.length-1])
- return -1;
-
- int left = 0;
- int right = nums.length;
-
- while(right>left)
- {
- int mid = left+((right-left)>>1);
- if(nums[mid]>target){
- right = mid;
- }else if(nums[mid]<target){
- left = mid+1;
- }else if(nums[mid]==target)
- return mid;
- }
- return -1;
- }
- }
要熟悉的掌握这两种方法,两种方法中mid的选取是不同的。
对于双指针的操作不够熟练。
- class Solution {
- public int removeElement(int[] nums, int val) {
- int left = 0;
- int right = nums.length-1;
- while(right >= 0 && nums[right] == val)
- right--;
- while(left <= right)
- {
- if(nums[left] == val)
- {
- nums[left] = nums[right];
- right--;
- }
- left++;
- while(right >= 0 && nums[right] == val)
- right--;
- }
- return left;
- }
- }
慢指针指向新数组的元素,一次循环后需要右移一位以便接收下次循环快指针找到的元素,当快指针遍历完nums,快指针的下标实际上就是新数组的长度。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。