SPOKANE, Wash. -- Gonzaga is one of the nation's elite offensive teams. On Thursday night, the Zags showed they can also grind out a defensive win.
Johnathan Williams scored 14 points and grabbed 12 rebounds as Gonzaga edged stubborn San Diego 69-59.
"We kind of needed it," Gonzaga's Zach Norvell Jr. said of the grinder. "We want to see what kind of guys we've got."
Norvell had two clutch 3-pointers in the closing minutes to keep the Zags ahead. The game featured poor shooting by both teams, and was close throughout.
"We got punched in the mouth a couple of times," Gonzaga coach Mark Few said. "We reacted the right way."
Norvell, who finished with 13 points, has got a knack for late game heroics, Few said.
"He's got a lot of confidence in himself," Few said of the freshman from Chicago.
Olin Carter III scored 21 points for San Diego (15-8, 6-5), a surprise team in the league this year.
"I thought we did a great job defensively," San Diego coach Lamont Smith said. "We just had a hard time boxing out."
"We gave them too many second chance opportunities and it's hard to do that and win on the road."
Gonzaga had 14 offensive rebounds they converted into 24 points. They outscored the Toreros 38-20 in the paint.
But neither team shot well, with Gonzaga making 41 percent and San Diego just 33 percent from the floor. In the first, Gonzaga went on a 12-0 run while the Toreros were in the midst of a 1 for 9 slump to take a 31-20 lead.
Gonzaga led 36-27 after a first half in which they held San Diego to 27 percent shooting (8 of 30).
San Diego opened the second half with a 13-2 run, including a pair of 3-pointers by Tyler Williams, to take a 40-38 lead.
But the Toreros did not score for more than eight minutes, missing 12 shots, and Gonzaga replied with an 11-0 run for a 49-40 lead. San Diego stormed back and Isaiah Pineiro's 3-pointer brought them within a point at 51-50. But it was a last gasp as Gonzaga closed the game on an 18-9 run.
Norvell hit a 3 to lift Gonzaga to a 61-54 lead with 3:02 left.
The teams traded baskets, but the Toreros could not make up ground.
The win lifted Gonzaga to a 21st consecutive year of at least 20 wins, and Few took a moment to bask in the achievement. "People think they (20 wins) magically land here in Spokane," Few said. "They don't. We're an anomaly. It's still an accomplishment."
San Diego made just 20 of 61 shots. Gonzaga made 25 of 61.
San Diego: The Toreros came in on a two-game winning streak and are fourth in the league. They are one of the nation's top defensive teams, limiting opponents to 64 points per game.
Gonzaga: The Bulldogs have won four in a row since losing to No. 13 Saint Mary's. The Zags have never lost to the Toreros in the McCarthey Athletic Center since it opened in 2004. Gonzaga is the only team in the nation that has six players averaging in double figures and is third in the nation with an average of 88.2 points per game.
San Diego: It doesn't get any easier for the Toreros, who host No. 13 Saint Mary's on Saturday.
Gonzaga: The Bulldogs on Saturday host BYU, the only team to defeat them in the regular season last year. Gonzaga's only other loss was to North Carolina in the NCAA title game.
More AP college basketball: https://collegebasketball.ap.org and https://twitter.com/AP-Top25
Mannion, who recently reclassified and is ESPN's No.11 overall player in the class of 2019, chose Arizona over Marquette.
He'll fit in with Sean Miller's plans for a faster tempo on offense.
The cream of the crop of American high school basketball will congregate in Colorado Springs from Oct. 5-7, as USA Basketball unveils its newly expanded Junior National Team minicamp in collaboration with the NBA, NCAA and NBPA.