本文共 2581 字,大约阅读时间需要 8 分钟。
题目要求:给定两个数组中的一个含有两个数字的方法,可以得到他们相加的结果。首先,我想用双重循环的方法来解决这个问题。
我们可以遍历第一个数组的每一个元素,然后在第二个数组中逐一匹配每一个元素,看是否存在满足条件的两个数字,其和等于目标值。如果发现匹配成功,则直接返回这两个数字的索引位置。这种方法的时间复杂度是O(n²),但对于短数组来说这是一个简单有效的方法。
public int[] twoSum(int[] nums, int target) { int[] index = new int[2]; for (int i = 0; i < nums.length; i++) { for (int j = i + 1; j < nums.length; j++) { if (nums[i] + nums[j] == target) { index[0] = i; index[1] = j; return index; } } } index[0] = -1; index[1] = -1; return index;}
为了优化这一步,我想到了一种更高效的方法——使用哈希表。哈希表能够将问题的复杂度从O(n²)降低到O(n),从空间复杂度下降到O(n)。
哈希表的定义:哈希表可以用来存储元素及其对应的值。当我们遍历数组时,我们可以每隔一个元素将当前元素的值作为键存储到哈希表中,其值则是其索引。然后,我们检查哈希表中是否存在一个值,使得当前元素加上目标值等于给定的目标。如果存在,则返回这两个索引。
时间和空间复杂度:该方法的时间复杂度为O(n),因为我们只需要遍历一次数组。空间复杂度为O(n),因为我们需要存储哈希表。
public int[] twoSum(int[] nums, int target) { MaphashTable = new HashMap<>(); for (int i = 0; i < nums.length; i++) { int currentNum = nums[i]; if (hashTable.containsKey(currentNum)) { int j = hashTable.get(currentNum); int[] result = new int[2]; result[0] = j; result[1] = i; return result; } else { hashTable.put(currentNum, i); } } int[] result = new int[2]; result[0] = -1; result[1] = -1; return result;}
一个稍微难一点的题目是将两个没有排序的链表相加,并返回结果链表。需要注意的是,链表的顺序是从较低位到较高位排列,因此在相加时要适当处理进位。
初始化变量:我们需要初始化一个新的链表来存储结果,并使用一个变量来跟踪进位。
遍历链表:同时遍历两个链表,逐个节点进行相加运算。如果某个链表已经遍历完,则将当前元素视为0,继续处理下一个链表中的节点。
处理进位:在每个节点中,计算当前值加上进位,然后更新当前节点的值和进位状态。
构建结果链表:在每次处理完一个节点后,移动对应链表的指针,构建结果链表的相应节点。
处理尾部进位:如果在遍历完所有节点后,仍有进位则需要在结果链表尾部添加对应的节点。
public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode result = new ListNode(0); ListNode current = result; int carry = 0; while (l1 != null || l2 != null) { int n1 = l1 != null ? l1.val : 0; int n2 = l2 != null ? l2.val : 0; int sum = n1 + n2 + carry; carry = sum / 10; int curVal = sum % 10; if (current.next == null) { current.next = new ListNode(curVal); } else { current = current.next; current.val = curVal; } if (l1 != null) { l1 = l1.next; } if (l2 != null) { l2 = l2.next; } } if (carry > 0) { current.next = new ListNode(carry); } return result.next;}
上述方法均是针对两数之和问题的不同解决思路,通过双重循环、哈希表以及链表结合进位技术实现了对问题的解决。每种方法都有其适用的场景和优劣势,选择哪种方法取决于具体问题的要求及性能需求。
转载地址:http://didez.baihongyu.com/