leetcode(1)

mac2024-07-08  57

1.两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

var twoSum=function(nums,target) { var temp=[] for(var i = 0;i<nums.length;i++) { var dif=target-nums[i]; if(temp[dif]!=undefined) { return [temp[dif],i]; } temp[nums[i]]=i; } }

2.翻转图像 将一个矩阵翻转后然后1,0取反 解法1:调用API

var filpAndInvertImage=function(A){ return A.map(item=>item.reverse().map(item1=>item1===0?1:0)) }

解法2:双指针

var flipAndInvertImage=function(A){ for(var i=0;i<A.length;i++){ let left=0; let right=A.length-1; while(left<right){ let temp=A[i][left]; A[i][left]=A[i][right]^1; A[i][right]=temp^1; left++; right--; } } return A }

3.删除排序数组中的重复项 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 解法一:

var removeDuplicates = function(nums){ for(let i=0;i<nums.length-1;i++){ //遍历数组中的元素 var temp=nums[i]; //将当前元素暂存进行比较 for(let j=i+1;j<nums.length;j++){ //从第i+1个元素开始比较 if(nums[j]==temp){ //如果发现重复元素 nums.splice(j,1); //在j位置删除1个元素 j--; //再次进行判断,防止出现两个连续的元素 } } } return nums.length; }

解法二(双指针):

var removeDuplicates = function(nums){ const len=nums.length; //数组长度会发生变化,先记录下来 if(len==0) return 0; let slow=0; //第一个指针指向不重复的数 for(let fast=1;fast<len;fast++){ //第二个指针遍历数组 if(nums[slow]!=nums[fast]){ //找到与第一个与第一个指针不同的数 slow++; //不重复的数字数目+1 nums[slow]=nums[fast]; //将这个不重复的数字计入数组 } } return slow+1; }

4.搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 你可以假设数组中无重复元素。

var searchInsert = function(nums, target) { if(nums.length==0) return 0; if(nums[0]>target) return 0; for(let i=0;i<nums.length;i++){ if(nums[i]>=target) return i; } return nums.length; };

解法一(二分法):

var searchInsert = function(nums, target) { let start =0; let end =nums.length-1; while(start<=end){ let mid=Math.round((start+end)/2) //Math.round四舍五入 if(nums[mid]==target){ return mid; }else if(nums[mid]<target){ start=mid+1; }else if(nums[mid]>target){ end=mid-1; } } return start; }
最新回复(0)