目录
第一题(两数之和)
问题描述
解题思路:
由于哈希查找的时间复杂度为 O(1),所以可以利用哈希容器 map 降低时间复杂度。
遍历数组 nums,i 为当前下标,每个值都判断map中是否存在 target-nums[i] 的 key 值。
如果存在则找到了两个值,如果不存在则将当前的 (nums[i],i) 存入 map 中,继续遍历直到找到为止。
如果最终都没有结果则抛出异常。
最终时间复杂度为o(n)
代码示例
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map=new HashMap<>();
for(int i=0;i<nums.length;i++){
if(map.containsKey(target-nums[i])){
return new int[] {map.get(target-nums[i]),i};
}
map.put(nums[i],i);
}
throw new IllegalArgumentException("No two sum solution");
}
}
HashMap用法:Java HashMap | 菜鸟教程
第二题(两数相加)
问题描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
解题思路
首先我的sum函数是求出问题所需要的算法。sum变量是进位或当前相加之和。(也可以将进位与和分离开来)。
然后我们new一个新的listnode l3作为存出结果的东西。
再然后把赋给一个l(相当于c语言中的指针思想),我们这里通过操作l来最后得到数据集合,这里的l3我们可以理解为头指针(指的链表第一个结点)。如果传入的两个链表有一个是非空我们就进行算法循环。求一位next一位,若有一个链表位数不够,自动补0,若两个都为空时,我们就看之前的sum是否有进位,进行处理即可。
代码示例
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
int sum=0;
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode l=sum(l1,l2);
return l;
}
public ListNode sum(ListNode l1,ListNode l2){
ListNode l3=new ListNode();
ListNode l=l3;
while(l1!=null||l2!=null){
if(l1==null){
l1=new ListNode(0);
}
if(l2==null){
l2=new ListNode(0);
}
sum=sum+l1.val+l2.val;
if(sum>9){
l.next=new ListNode(sum%10);
sum=1;
}else{
l.next=new ListNode(sum);
sum=0;
}
l1=l1.next;
l2=l2.next;
l=l.next;
}
if(sum>0){
l.next=new ListNode(sum);
}
return l3.next;
}
}
第三题(无重复字符的最长子串)
问题描述
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
解题思路
我这里用的java中提供的实现了队列功能的LinkedList。
首先将字符串转换成字符数组,方便处理。temp是临时最大无重复子串长度,
然后若队列中有要加入的字符,则判断队列中的长度是否大于temp,进行处理,同时出队直到队列中字符等于该字符。
循环结束后,再次判断队列长度和temp。最后求出最大无重复字符长度。
代码示例
class Solution {
public int lengthOfLongestSubstring(String s) {
char str[]=s.toCharArray();
int temp=0;
LinkedList<Character> linked = new LinkedList<>();
for(int i=0;i<str.length;i++){
if(linked.contains(str[i])){
if(temp<linked.size()){
temp=linked.size();
}
while(linked.removeFirst()!=str[i]){
}
}
linked.add(str[i]);
}
if(temp<linked.size()){
temp=linked.size();
}
return temp;
}
}