1.两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
思路一:暴力解法
class Solution {
public int[] twoSum(int[] nums, int target) {
int i,j;
int[] faye=new int[1]; //返回一个长度为1的数组
for(i=0;i<nums.length-1;i++)
{
for(j=i+1;j<nums.length;j++)
{
if (nums[i]+nums[j]==target)
return new int[] {i,j}; //faye=new int[] {i,j} 创立新的数组返回给原来的函数
}
}
return faye;//或者 return new int[2] 返回一个长度为2的空数组
}
}
时间复杂度O(n^2),空间复杂度为0;
双指针思路
举例,数组为[2,3,5,7]的有序数组,可以用双指针来实现。
int low=0;
int hight=nums.length-1;
while(low<hight) {
int faye=nums[low]+nums[hight];
if (faye>target){ //如果目标值大于target 高位减一
hight--;
}else if (faye<target){
low++;
}else //如果相加的值相等
return new int[] {low,hight}; //返回下标
}
return new int[2]; //返回一个新的数组
unsorted不是有序数组
如果用Arrays.sort()使数组变有序会造成时间复杂度O(n logn)更大,同时不满足数组下标题意。
运用哈希表
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> faye=new HashMap<>();//重写Map里面的方法,仅含有父类的方法
for (int i=0;i<nums.length;i++){
int leslie = target-nums[i];//差值
if (faye.containsKey(leslie))//判断值是否在哈希表内
{
return new int[] {faye.get(leslie),i};//哈希表中target-nums[i]键的值
}//如果不在表内,则把<key,value>加入表中
faye.put(nums[i],i);
}
return new int[2];
}
Map接口的常用方法
Map初始化
Map<String, String> map = new HashMap<>();
Integer 类在对象中包装了一个基本类型 int 的值,该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,还提供了处理 int 类型时非常有用的其在他一些常量和方法
第771题
给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。
J 中的字母不重复,J 和 S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。
示例 1:
输入: J = “aA”, S = “aAAbbbb”
输出: 3
public int numJewelsInStones(String jewels, String stones) {
Set<Character> faye= new HashSet();//<Character> 为char的对象类
int leslie=0;
for (int i =0;i<jewels.length();i++){
faye.add(jewels.charAt(i));//set.add往结合添加元素
}
for (int j =0;j<stones.length();j++){
if(faye.contains(stones.charAt(j)))//在珠宝集合中,石头是否含有相同元素
leslie++;
}
return leslie;
}
HashSet源码解析
Java集合
String.charAt()返回数组下标的处的 char值 s=“hello” charAt(1)=e