//第二遍做题: 时间复杂度0(n^2) 空间复杂度0(1)
class Solution {
public int[] twoSum(int[] nums, int target) {
//首先写一个数组
int[] index = new int[2];
//遍历数组
for(int i=0 ; i<nums-1 ; i++){
for(int j=i+1 ; j<nums ; j++){
if(target - nums[i] == nums[j]){
index[0] = nums[i];
index[1] = nums[j];
}
}
}
return index;
}
}
//再加一种方法,用哈希表 时间复杂度0(n) 0(n)
class Solution {
public int[] twoSum(int[] nums, int target) {
//用哈希表,数组值存为key,下标值存为value,也就是我们通过key来进行判断,返回value的值
Map<Integer , Integer> map = new HashMap<Integer,Integer>();
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);
}
return new int[0];
}
}
//解题思路:此题相对简化,因为给了“逆序”,所以相对要好做一些,我们遍历两个链表,然后让相应节点的val相加
//然后看是否进位,是否进位用“carry”表示,然后定义两个空结点,一个后移,一个返回
//时间复杂度0(max(m,n)) 空间复杂度0(1)不是O(n)
//总之就是说让他们对应位相加,直到其中一链表为空,然后把另一个链表移到当前链表上
/*
注意点:
1、两个节点,一个遍历节点一个头节点
2、进位问题,并且最高位判断是否有进位
*/
class Solution {
//这道题要注意进位,要注意字符串是否为空,要建立一个新的结点管理他们的相应结点的值,当其中一个链表短时,则后面用0替代
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//先写新的链表(注意是两个节点,一个遍历,一个返回头节点)
ListNode temp = null;
ListNode head = null;
//进位
int carry = 0;
while(l1 != null || l2 != null){
//怕有链表后面用0补充
int n1 = l1 == null ? 0 : l1.val;
int n2 = l2 == null ? 0 : l2.val;
//计算当前结点的值
int sum = n1 + n2 + carry;
//求是否有进位
int curVal = sum % 10;
carry = sum/10; //不能放前面
//往新的链表上加
//不过要和第一个点区别开来
if(head == null){
head= temp = new ListNode(curVal);
}else{
temp.next = new ListNode(curVal);
temp = temp.next;
}
//往下面移动
if(l1!=null)
l1 = l1.next;
if(l2!=null)
l2 = l2.next;
//然后尾部需要判断是否有进位
if(carry > 0)
temp.next = new ListNode(carry);
}
return head;
}
}