往期
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
解析:
循环数组,将目标值减去数组的每一个值保存到键值对中,并保存当前数组值的下标;与下一个数组值进行比较,若相同则得出结果
中心思想:本末倒置
代码:
public static int[] TwoSum(int[] nums, int target)
{
Dictionary<int, int> dic = new Dictionary<int, int>();
for (int i = 0; i < nums.Length; i++)
{
var diff = target - nums[i];
if (dic.ContainsKey(nums[i]))
{
return new int[] { dic[nums[i]], i };
}
if(!dic.ContainsKey(diff))
{
dic.Add(diff, i);
}
}
throw new ArgumentNullException("没有找到目标值");
}
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
解析:
得到两个链表的当前节点值,将当前节点值相加,将相加结果取模,就是新链表的当前节点值;因为每一个节点存储的值只能是个位数,所以若当前节点相加的值若大于10则需要向下一个节点递进1,所以每一个节点相加时都要向下一个节点传递进位数。
中心思想:递归链表所有节点
代码:
public class ListNode
{
public int val;
public ListNode next;
public ListNode(int x) { val = x; }
}
public static ListNode AddTwoNumbers(ListNode l1, ListNode l2,int num = 0)
{
if(l1 == null && l2 == null)
{
if (num != 0)
return new ListNode(num);
else
return default;
}
int midValue = (l1?.val ?? 0) + (l2?.val ?? 0) + num;
var ListNode = new ListNode(midValue % 10);
ListNode.next = AddTwoNumbers(l1?.next,l2?.next,midValue / 10);
return ListNode;
}
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 :
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
解析:
从题目可得知此题就像是一个滑动块,从第一个字符开始进入块中,当进入块的所有字符碰到重复字符时,则就要从头开始装块;
如下:
(abc)abcbb : 滑块从a开始装,装到第4个字符时碰到了重复字符,则成为这种情况(abca)bcbb ,此时已经不符合题目了,所以要剔除掉一个a,剔除的a肯定是要剔除第一个,因为下一个滑块是要从第2个字符开始,所以滑块现在变为a(bca)bcbb,这样则符合题目,再滑动到下一个字符时,又出现了新的重复字符a(bcab)cbb,这样也要剔除第一个b;依次类推下去,滑块滑完了,所以在滑块每依次滑动时,我们记录下滑块的长度,取出最大的长度则是得出的结果。
中心思想:队列(先进先出)
代码:
public static int LengthOfLongestSubstring(string s)
{
int max = 0;
Queue<char> q = new Queue<char>();
foreach (char c in s)
{
while (q.Contains(c))
q.Dequeue();
q.Enqueue(c);
if (q.Count > max)
max = q.Count;
}
return max;
}
本文档涵盖三个算法问题:数组中寻找和为目标值的两个数、链表相加求和及最长无重复字符子串。通过中心思想和代码实例解析了如何分别用中心思想解决每个问题:'本末倒置'、'递归链表'和'队列滑动'。
454

被折叠的 条评论
为什么被折叠?



