剑指 Offer 47. 礼物的最大价值
class Solution {
public int maxValue(int[][] grid) {
int n=grid.length;
int m=grid[0].length;
int[][] dp=new int[n][m];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(i==0&&j==0){
dp[i][j]=grid[0][0];
continue;
}
if(i==0){
dp[i][j]=dp[i][j-1]+grid[i][j];
}else if(j==0){
dp[i][j]=dp[i-1][j]+grid[i][j];
}else{
dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1])+grid[i][j];
}
}
}
return dp[n-1][m-1];
}
}
剑指 Offer 46. 把数字翻译成字符串
class Solution {
public int translateNum(int num) {
//没想出来方法原因,未看出此题的模型就是小青蛙跳台阶问题
//使方案增多就是当相邻两个数字大于等于10且小于等于25时
String s=String.valueOf(num);
int n=s.length();
int[] dp=new int[n];
dp[0]=1;
for(int i=1;i<s.length();i++){
String temp=s.substring(i-1,i+1);
//compareTo返回为正数表示a1>a2, 返回为负数表示a1<a2, 返回为0表示a1==a2。
// if(temp.compareTo(10)>=0&&temp.compareTo(25)<=0){
if(temp.compareTo("10")>=0&&temp.compareTo("25")<=0){
if(i>1) dp[i]=dp[i-1]+dp[i-2];
else dp[i]=dp[i-1]+1;
}else{
dp[i]=dp[i-1];
}
}
return dp[n-1];
}
}
剑指 Offer 22. 链表中倒数第k个节点
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode cur=head;
int count=0;
while(cur!=null){
count++;
cur=cur.next;
}
for(int i=0;i<count-k;i++){
head=head.next;
}
return head;
}
}
方法二: 双指针法,不用再先遍历链表求其长度了。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
//双指针法,不需要知道链表长度,指针1先走k-1步,然后指针2和指针1同时前进,当指针1指向链表最后一个元素时,指针2即为所求。
ListNode l1=head;
ListNode l2=head;
for(int i=0;i<k-1;i++){
l1=l1.next;
}
while(l1.next!=null){
l1=l1.next;
l2=l2.next;
}
return l2;
}
}
剑指 Offer 25. 合并两个排序的链表
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1==null&&l2==null) return null;
if(l1==null) return l2;
if(l2==null) return l1;
ListNode t1=l1;
ListNode t2=l2;
ListNode new_head=new ListNode(0);
ListNode cur=new_head;
while(t1!=null&&t2!=null){
if(t1.val<t2.val){
cur.next=t1;
cur=cur.next;
t1=t1.next;
}else{
cur.next=t2;
cur=cur.next;
t2=t2.next;
}
}
if(t1==null){
cur.next=t2;
}else{
cur.next=t1;
}
return new_head.next;
}
}