328. 奇偶链表
/**
* 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 {
public ListNode oddEvenList(ListNode head) {
//思路:直接根据奇偶节点修改指向
if(head==null || head.next==null || head.next.next==null){
return head;
}
ListNode js=head;
ListNode os=head.next;
ListNode jsw=head;
ListNode osw=head.next;
//注意细节
// while(jsw!=null && osw!=null){
while(jsw.next!=null && osw.next!=null){
jsw.next=osw.next;
jsw=jsw.next;
osw.next=jsw.next;
osw=osw.next;
}
jsw.next=os;
return js;
}
}
53. 最大子数组和
class Solution {
public int maxSubArray(int[] nums) {
int n=nums.length;
//dp[i]表示截止到下标为i的数组的连续子数组的最大和
int[] dp=new int[n];
dp[0]=nums[0];
int max=nums[0];
for(int i=1;i<n;i++){
dp[i]=Math.max(dp[i-1]+nums[i],nums[i]);
max=Math.max(max,dp[i]);
}
return max;
}
}
88. 合并两个有序数组
方法一:无技巧法
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int count=0;
for(int i=m;i<nums1.length;i++){
nums1[i]=nums2[count++];
}
Arrays.sort(nums1);
}
}
方法二:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
//提升法:逆向双指针,这样数组nums1前面的值不会被影响
int count=n+m-1;
int n1=m-1;
int n2=n-1;
if(m==0){
for(int i=0;i<n;i++){
nums1[i]=nums2[i];
}
}
if(n==0) return ;
while(count>=0){
if(n1<0){
// if(n1==-1){
nums1[count]=nums2[n2];
n2--;
}else if(n2 < 0){
// }else if(n2==-1){
nums1[count]=nums1[n1];
n1--;
}else if(nums2[n2]>=nums1[n1]){
nums1[count]=nums2[n2];
n2--;
}else {
nums1[count]=nums1[n1];
n1--;
}
// n1小于0时,说明nums1数组全部放完,直接将nums2放进去即可。
count--;
}
}
}
350. 两个数组的交集 II
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
//此题不知道如何确定返回数组的长度
将一个原始的数组original,从下标from开始复制,复制到上标to,生成一个新的数组,注意这里包括下标from,不包括上标to。
// return Arrays.copyOfRange(res,0,index);
//理解错了交集的含义
// Set<Integer> set=new HashSet<>();
HashMap<Integer,Integer> map=new HashMap<>();
int n=nums1.length;
int m=nums2.length;
int len=n>m?n:m;
int[] res=new int[len];
for(int i=0;i<n;i++){
map.put(nums1[i],map.getOrDefault(nums1[i],0)+1);
}
int count=0;
for(int i=0;i<m;i++){
if(map.containsKey(nums2[i])){
res[count++]=nums2[i];
int t=map.get(nums2[i]);
if(t-1==0){
map.remove(nums2[i]);
}else{
map.put(nums2[i],t-1);
}
}
}
return Arrays.copyOfRange(res,0,count);
}
}